Как я могу вызвать ViewDidAppear только один раз? - PullRequest
7 голосов
/ 14 февраля 2010

Когда пользователь запускает приложение, я хочу, чтобы оно показывало stockholm.xib и это здесь:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    NSUserDefaults *startPage =[NSUserDefaults standardUserDefaults];
    NSString *page =[startPage stringForKey:@"page"];
    NSLog(page);

    if(page==nil)
    {
        //Do nothing

    }
    else if ([page isEqualToString:@"Default"])
    {
        //Do nothing
    }

    else if ([page isEqualToString:@"Stockholm"])
    {
        NSLog(@"going to Stockholm");
        Stockholm *Start =[[Stockholm alloc]initWithNibName:nil bundle:nil];
        [self presentModalViewController:Start animated:YES];


    }
    else {
        NSLog(@"HAHA");

}

но когда пользователь закрывает stockholm.xib, используя:

[self dismissModalViewControllerAnimated:YES];

после завершения анимации приложение вылетает. и причина в том, что, я думаю, viewDidAppear вызывает дважды, и поэтому пытается открыть недавно закрытый файл xib.

Теперь, как я могу вызвать вид, который появился только один раз? так что когда пользователь вернется из Стокгольма, viewDidAppear не будет вызван? любое другое решение?

спасибо:)

Ответы [ 3 ]

14 голосов
/ 14 февраля 2010

Вы можете попробовать переместить все эти функции в метод viewDidLoad: вместо viewDidAppear. Тот стреляет только один раз. Если только у вас нет причин не ...?

РЕДАКТИРОВАТЬ: больше кода, чтобы показать, что я имею в виду в комментарии

в файле .h:

BOOL firstTime;

в файле .m:

-(void)viewDidLoad {
   NSLog(@"viewDidLoad actually fired");
   //...
   firstTime = YES;
}
-(void)viewDidAppear {
   //...
   if(firstTime){
      //show it
      firstTime = NO;
   }
}
6 голосов
/ 08 февраля 2012

Вы также можете использовать GCD, если в вашем классе есть такие поля, как:

@interface MyClass {
    dispatch_once_t once;
}

@end

@interface MyClass {
    - (void)viewDidAppear:(BOOL)animated {
        dispatch_once(&once, ^{
            // do business
        });
    }
@end
1 голос
/ 02 мая 2013

Вы можете добавить свойство, такое как BOOL, загруженное в ваш viewcontroller, установить его в false в viewdidload, а затем сделать ваш метод viewDidAppear следующим образом:

- (void)viewDidAppear:(BOOL)animated {
    if (!loaded) {
        //code
    } else {
        return;
    }
    loaded = YES;
}

Это работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...