UILabel setText не работает в viewWillAppear - PullRequest
1 голос
/ 09 марта 2012

В ViewController у меня есть следующее:

- (void)viewWillAppear:(BOOL)animated
{
    DataObject *theDataObject = [self theAppDataObject];
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"MMM dd, yyyy HH:mm"];
    NSString *dateStr = [formatter stringFromDate:theDataObject.deadline];
    NSLog(@"Logged dateStr: %@", dateStr);
    [dateTimeLabel setText:dateStr];
    [super viewWillAppear:animated];
}

Чтобы уточнить: dateTimeLabel IS подключен в файле xib.Метод viewWillAppear явно вызывается из другого ViewController и запускается следующим образом:

- (IBAction)setDateTimeButtonClicked:(id)sender
{
    DataObject *theDataObject = [self theAppDataObject];

    theDataObject.deadline = [datePicker date];

    FirstMobileViewController *mobileVC = [[FirstMobileViewController alloc] init];
    [mobileVC viewWillAppear:YES];
    [mobileVC release];

    [UIView transitionWithView:self.view.superview 
                      duration:0.5 
                       options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionAllowAnimatedContent 
                    animations:^{[self.view removeFromSuperview];} 
                    completion:NULL];
}

Метод viewWillAppear запускается - dateStr регистрируется соответствующим образом NSLogкогда суперпредставление показывается снова.Но dateTimeLabel никогда не обновляется.Очевидно, что комментирование строки NSLog не имеет значения.

MADDENING состоит в том, что даже если NSLog logs dateStr просто отлично,если я изменю dateStr, скажем, @"Yo!" или даже на локально инициализированную строку, то dateTimeLabel обновится, без проблем.

Что мне здесь не хватает?

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Ваш метод добавления дочернего контроллера представления неверен. Попробуйте использовать следующий код (в вашем методе, когда вы вызываете ViewWillAppear, думайте, что представление контроллера представления еще не инициализировано. (Вы можете проверить это простым взломом: добавление mobileVC.view; сразу после инициализации mobileVC)

    - (IBAction)setDateTimeButtonClicked:(id)sender {
        DataObject *theDataObject = [self theAppDataObject];

        theDataObject.deadline = [datePicker date];

        FirstMobileViewController *mobileVC = [[FirstMobileViewController alloc] init];
        [self addChildViewController:mobileVC];
        UIView *superView = self.view.superview;
        mobileVC.view.frame = superView.bounds;

        [UIView transitionWithView:superview 
                          duration:0.5 
                           options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionAllowAnimatedContent 
                        animations:^{[self.view removeFromSuperview];
                                      [superview addSubView:mobileVC.view]} 
                        completion:^(BOOL finished) {
                                      [mobileVC didMoveToParentViewController:self];
         }]; 
     }

При использовании этого метода viewWillAppear должен вызываться автоматически.

0 голосов
/ 09 марта 2012

Поместите [super viewWillAppear: animated] в начало viewWillAppear.

Возможно, вы никогда не подключите dateTimeLabel в xib к dateTimeLabel.

Попробуйте использовать [себя. dateTimeLabel setText: dateStr]

0 голосов
/ 09 марта 2012

Во-первых, вы выпускаете mobileVC, прежде чем что-то делать с ним, поэтому пока он выполняет код в методе viewWillAppear:, это все, что происходит.

Вы также не загружаете файл XIB для mobileVC, поскольку вы только alloc и init его. Поэтому объекты, на которые вы ссылаетесь в viewWillAppear, скорее всего, не существуют в тот момент, когда вы явно вызываете метод.

Вы не показали код, который вы используете для представления mobileVC, поэтому трудно угадать, каким будет исправление, или понять причудливую проблему, возникающую при работе строковых литералов. Но достаточно сказать, что при представлении нового контроллера представления это будет другой экземпляр, чем тот, который вы явно назвали.

Возможное исправление:

  1. Используйте initWithNibName:bundle: вместо простого init, чтобы убедиться, что ваш XIB загружен. Затем передайте mobileVC в блок завершения вашего перехода, чтобы представить его?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...