Проблема iPad с модальным представлением: метка модального представления пуста после создания контроллера представления - PullRequest
0 голосов
/ 01 июня 2010

Это странная проблема. Я создал контроллер представления с файлом пера для моего модального представления. В этом представлении есть метка, номер и текстовое представление. Когда я создавал представление из исходного представления, я пытался установить метку, но она показывает, что метка null (0x0). Какая-то странная ... Есть предложения? Теперь давайте посмотрим на код (я поместил весь код здесь, потому что это показывает больше, чем я могу просто объяснить):

Контроллер модального вида - в IB метка связана с объектом UILabel:

    @implementation ModalViewController

@synthesize delegate;
@synthesize goalLabel, goalText, goalNumber;

// Done button clicked
- (void)dismissView:(id)sender {

    // Call the delegate to dismiss the modal view
    if ([delegate respondsToSelector:@selector(didDismissModalView: newText:)]) {

        NSNumber *tmpNum = goalNumber;
        NSString *tmpString = [[NSString alloc] initWithString:[goalText text]];
        [delegate didDismissModalView:tmpNum newText:tmpString];

        [tmpNum release];
        [tmpString release];
    }
}

- (void)cancelView:(id)sender {

    // Call the delegate to dismiss the modal view
    if ([delegate respondsToSelector:@selector(didCancelModalView)])
        [delegate didCancelModalView];
}

-(void) setLabelText:(NSString *)text {
    [goalLabel setText:text];
}

/*
 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization
    }
    return self;
}
*/

-(void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    // bring up the keyboard....
    [goalText becomeFirstResponder];
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    // set the current goal number to -1 so we know none was set
    goalNumber = [NSNumber numberWithInt: -1];

    // Override the right button to show a Done button
    // which is used to dismiss the modal view
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
                                               initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                               target:self
                                               action:@selector(dismissView:)] autorelease];

    // and now for the cancel button
    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc]
                                               initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
                                               target:self
                                              action:@selector(cancelView:)] autorelease];

    self.navigationItem.title = @"Add/Update Goals";
}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}


- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}


@end

И вот где создается контроллер представления, устанавливаются и отображаются переменные:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // put a checkmark....
    UITableViewCell *tmpCell = [tableView cellForRowAtIndexPath:indexPath];
    [tmpCell setAccessoryType:UITableViewCellAccessoryCheckmark];

    // this is where the popup is gonna popup!
    // ===> HEre We Go!

    // Create the modal view controller
    ModalViewController *mdvc = [[ModalViewController alloc] initWithNibName:@"ModalDetailView" bundle:nil];

    // We are the delegate responsible for dismissing the modal view 
    [mdvc setDelegate:self];

    // Create a Navigation controller
    UINavigationController *navController = [[UINavigationController alloc]
                                             initWithRootViewController:mdvc];

    // set the modal view type
    navController.modalPresentationStyle = UIModalPresentationFormSheet;

    // set the label for all of the goals....
    if (indexPath.section == 0 && indexPath.row == 0) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 1:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:1]];
    }

    if (indexPath.section == 0 && indexPath.row == 1) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 2:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:2]];
    }

    if (indexPath.section == 0 && indexPath.row == 2) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 3:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:3]];
    }

    if (indexPath.section == 0 && indexPath.row == 3) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 4:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:4]];
    }


    if (indexPath.section == 1 && indexPath.row == 0) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 1:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:5]];
    }

    if (indexPath.section == 1 && indexPath.row == 1) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 2:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:6]];
    }

    if (indexPath.section == 1 && indexPath.row == 2) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 3:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:7]];
    }

    if (indexPath.section == 1 && indexPath.row == 3) {
        [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 4:"] autorelease]];
        [mdvc setGoalNumber:[NSNumber numberWithInt:8]];
    }

    // show the navigation controller modally
    [self presentModalViewController:navController animated:YES];

    // Clean up resources
    [navController release];
    [mdvc release];

    // ==> Ah... we are done...
}

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Ради полноты, если кто-то еще наткнется на это (это помогло мне) ...

Интерфейс контроллера модального представления должен определить переменную для хранения делегата:

@protocol ReminderPhotoViewDelegate <NSObject>
@required
- (void)willShow:(id)theView;
@end
@interface ReminderPhotoViewController : UIViewController {
    id<ReminderPhotoViewDelegate> delegate;
    UIImageView *reminderImage;
    UILabel *reminderLabel;
}
@property (assign) id<ReminderPhotoViewDelegate> delegate;
@property (nonatomic, retain) IBOutlet UIImageView *reminderImage;
@property (nonatomic, retain) IBOutlet UILabel *reminderLabel;
@end

В рамках реализации модального контроллера обязательно синтезируйте эти свойства:

@implementation ReminderPhotoViewController
@synthesize reminderImage, reminderLabel;
@synthesize delegate;

Каким бы ни был ваш "вызывающий" контроллер, он должен объявить поддержку этого протокола в своей собственной реализации:

#import "ReminderPhotoViewController.h"
@interface ReminderViewController : UIViewController <ReminderPhotoViewDelegate> {
}

Наконец, когда вы создаете экземпляр вашего модального контроллера, вам нужно установить вызывающий класс в качестве его делегата:

ReminderPhotoViewController *photo = [[ReminderPhotoViewController alloc] init];
[photo setDelegate:self];

Это более полный набор объявлений и кода - это именно то, что показывает ответ, только с большим количеством вспомогательного кода.

Затем, как отмечено выше, ваш вызывающий контроллер добавляет метод из протокола:

- (void)willShow:(ReminderPhotoViewController *)theView {
    theView.reminderImage.image = selectedImage;
    theView.reminderLabel.text = selectedText;
}
1 голос
/ 06 июня 2010

Ответ смотрел мне в лицо!

Вот что я сделал:

Добавлена ​​новая функция для делегата

@protocol ModalViewControllerDelegate <NSObject>
@required
    - (void)didDismissModalView:(NSNumber *)goalNbr newText:(NSString *)textToSave;
    - (void)didCancelModalView;
    - (void)willShow:(id)theView;
@end

В функции viewWillAppear я добавил следующее:

if ([delegate respondsToSelector:@selector(willShow:)])
    [delegate willShow:self];

Это позволяет получить полный доступ к модальному виду, который будет отображаться, поэтому мы можем изменить метку, текстовое поле и переменные в активном модальном виде.

- (void)willShow:(ModalViewController *)theView {

    [theView.goalLabel setText:labelText];
    [theView setGoalNumber:goalNumber];
    [theView.goalText setText:goalText];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...