viewDidAppear 只在某些情况下被调用?
Posted
技术标签:
【中文标题】viewDidAppear 只在某些情况下被调用?【英文标题】:viewDidAppear only gets called under certain circumstances? 【发布时间】:2015-02-26 20:33:29 【问题描述】:我有这个突然出现的问题,我检查了我在过去一周所做的所有更改,但似乎没有什么可以解释为什么我的 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 都实现了 [super view...:animated];
再一次,我有一段时间没有对我的任何加载、显示、方法进行任何重大更改。我真的不明白为什么现在会发生这种情况。
谁能解释一下?此外,每隔一段时间,可能有 10% 的时间,viewDidAppear 方法会在推送“onHost”通知时被触发。
感谢您的帮助。这让我难以置信。
编辑:我回滚到几天前的提交并开始重建我的项目。到目前为止 viewDidAppear 正在工作。我将尝试查明到底是什么搞砸了一切。很奇怪,因为我必须重建的大部分只是 Helper 方法和次要的 UI 更新。
【问题讨论】:
我应该假设前两个方法在同一个类中实现吗?如果你在那个类中有/创建了一个prepareForSegue:
方法,它会被调用吗?
是的,它们在同一个类中,我使用的是 prepareForSegue: 方法。它正在被调用。推送到新的 VC 对每个通知都有效,我只是用它来解释 viewDidAppear 如何只在一种情况下工作。但是,viewDidAppear 仅在从“onInitialze”通知@PhillipMills 推送后才有效
【参考方案1】:
这些方法应该每次都被调用,我从来没有见过它们没有被调用。
也许您正在使用从 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:
。
【讨论】:
感谢您的回复,但我认为情况并非如此。我没有使用交互式过渡。没有任何东西从 UIViewController 继承。 真的吗?你确定你没有 UIViewController 子类吗?这将是一个非常奇怪的应用程序;除了“viewWillAppear”是在 UIViewController 中定义的。所以你的问题没有多大意义...... 哦,我当然知道,对不起。是的,我所有的 UIViewController 子类都实现了 [super view...];【参考方案2】:您的导航控制器是否曾经落后于任何东西?例如,我认为如果您使用 presentViewController: 在导航控制器顶部显示模式视图控制器,然后将 VC 推送到导航控制器上,则不会调用 viewDidAppear,因为 ios 会认为它在屏幕外。
您是否尝试过将 NSLogs 放入导航控制器的 viewWillAppear 和 viewWillDisappear 方法,以确保导航控制器在您推送新视图控制器时认为它是可见的?
【讨论】:
以上是关于viewDidAppear 只在某些情况下被调用?的主要内容,如果未能解决你的问题,请参考以下文章
将 .csv 导入 MySQL 数据库时,某些数据在没有明显原因的情况下被修改,知道吗?