Viewdidload работает, а viewwillappear задерживается

У меня есть проект, в котором я переключаю один вид на другой:

- (IBAction)onClick:(id)sender
{
ViewControllerSecond * sc=[[ViewControllerSecond alloc]initWithNibName:@"ViewControllerSecond" bundle:nil];
[UIView transitionFromView:self.view toView:sc.view duration:3.0
                   options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {

}];
}

Я использую 3 секунды здесь, чтобы подчеркнуть. в этом втором представлении у меня есть метод обновления графического интерфейса, который добавляет другое представление из контроллера представления:

    -(void)updateGUI
{

    sample=[[ViewControllerSample alloc]initWithNibName:@"ViewControllerSample" bundle:nil];
    sample.view.frame=CGRectOffset(sample.view.frame, 0, 150);
    [self.view addSubview:sample.view];
}

Теперь вот проблема: когда я вызываю это из функции viewDidLoad, все работает нормально. Однако при вызове из функции viewWillAppear представление появится в верхней части экрана и только после окончания анимации переместится на свое место. Как это можно исправить?


person donald    schedule 08.11.2012    source источник


Ответы (3)


Что плохого в том, чтобы поставить его на viewDidLoad?

Судя по всему, заказ загружается, а затем анимируются методы появления делегата. Также поместите свой образец=[[ViewControllerSample alloc]initWithNibName:@"ViewControllerSample" bundle:nil]; в части инициализации вашего второго контроллера представления.

Кроме того, вы можете вызвать updateGUI перед анимацией. Итак, перед [переходом UIView...

[sc updateGUI];
person mashdup    schedule 08.11.2012
comment
viewDidLoad будет вызываться только один раз, повторно использовать код нельзя. однако я обнаружил, что ответ сочетает в себе эти две функции: вызовите обновление, как вы упомянули, после завершения загрузки и вызовите его, если представление уже загружено при повторном использовании контроллера. Ваш ответ помог мне найти решение, и я благодарен за время, которое вы потратили на ответ. - person donald; 08.11.2012
comment
Я обновил полный ответ выше, я ценю вклад, но он нуждается в некоторой доработке. - person donald; 10.11.2012

Просто позвоните updateGUI в viewDidLoad. Не делайте много работы в viewWillAppear. viewWillAppear предотвратит появление вашего представления, если вы заставите его выполнять слишком много работы.

person sunkehappy    schedule 08.11.2012
comment
Дело в повторном использовании представления, поэтому я не делаю этого в разделе viewDidLoad. - person donald; 08.11.2012

Ответ на это состоял из двух частей:

  1. обновить при загрузке представления, однако это произойдет только один раз, поэтому для повторного использования контроллера мне нужно снова вызвать его.
  2. используйте isViewLoaded, чтобы увидеть, загружено ли представление. если это так, то вызовите метод обновления.
person donald    schedule 09.11.2012