我有这个突然出现的问题,我检查了过去一周所做的所有更改,似乎没有解释为什么我的viewDidAppear只在某些情况下推送到我的VC时被调用。这是我推送VC的两种方式。
-(void)receiveOnHostRoomConnectNotification:(NSNotification *)notificaiton
{
[[NSNotificationCenter defaultCenter]removeObserver:self name:kInitialize object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self name:kOnHostRoomConnect object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self name:kOnConnect object:nil];
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@"toSetListRoomVC" sender:self];
});
}
得到这个' onHost'通知我执行segue。像这样推送VC每天都有效。 viewDidAppear会在SetListRoomVC中被调用。
但是,在推送此通知时。 destinationVC的viewDidAppear永远不会被解雇。我曾经对这些方法做过任何改动,我怀疑它与它们有什么关系,但只是解释发生了什么。
-(void)receiveInitializeNotification:(NSNotification *)notificaiton
{
[[NSNotificationCenter defaultCenter]removeObserver:self name:kInitialize object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self name:kOnHostRoomConnect object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self name:kOnConnect object:nil];
if (self.joinLabelSelected) {
self.roomCodeTextField.inputAccessoryView.hidden = YES;
[self.roomCodeTextField resignFirstResponder];
self.menuView.hidden = YES;
[self returnJoinLabel];
[UIView animateWithDuration:.25 animations:^{
self.roomCodeView.alpha = 0;
self.blurEffectView.alpha = 0;
} completion:^(BOOL finished) {
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@"toSetListRoomVC" sender:self];
});
}];
}
}
我也在使用自定义segue和嵌入式导航控制器。这就是我设置自定义segue的方法。
@implementation CustomSegue
-(void) perform{
[[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:NO];
}
@end
我的所有viewDidLoad,viewWillAppear,viewDidAppear实现[超级视图...:动画];
再一次,我暂时没有对我的任何负载,出现,方法做出任何重大改变。我真的不明白为什么现在这样。
有人能解释一下吗?此外,每隔一段时间,也许有10%的时间,viewDidAppear方法将在推送' onHost'通知。
感谢您的帮助。这令人难以置信。
编辑:我几天前回到了一个提交,并开始重建我的项目。到目前为止viewDidAppear正在工作。我将尝试确定究竟是什么搞砸了一切。很奇怪,因为我必须重建的大部分内容只是Helper方法和次要的UI更新。答案 0 :(得分:0)
每次都应该调用这些方法,而且我从未见过它们没有被调用过。
也许您正在使用从UIViewController继承的多个子类并忘记调用super?在这种情况下,确实没有调用超级实现:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// do your stuff
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// do your stuff
}
- (void)viewWillDisappear:(BOOL)animated {
// do your stuff
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated {
// do your stuff
[super viewDidDisappear:animated];
}
可能会出现一些罕见的交互式UINavigationController
转换情况,其中可能会调用-viewWillDisappear:
,但不会调用-viewDidDisappear:
。例如。如果用户从屏幕左侧擦除以导航回来然后取消此操作。这可能会产生-viewWillDisappear:
,但没有相应的-viewDidDisappear:
。
答案 1 :(得分:0)
您的导航控制器是否落后于任何东西?例如,我想如果您使用presentViewController:在导航控制器顶部显示模态视图控制器,然后将VC推送到导航控制器上,则不会调用viewDidAppear,因为iOS会认为它在屏幕外。
您是否尝试过将NSLogs放在导航控制器的viewWillAppear和viewWillDisappear方法中,以确保导航控制器在推送新视图控制器时认为它是可见的?