viewWillDisappear 被调用两次
Posted
技术标签:
【中文标题】viewWillDisappear 被调用两次【英文标题】:viewWillDisappear is called twice 【发布时间】:2012-04-13 08:27:52 【问题描述】:我的应用使用带有拆分视图控制器的情节提要。在左侧,我有一个带有选项列表的表格视图。在右侧,我有一些关于左侧选项的信息。就像在设置应用程序中一样。当用户选择左侧的选项时,右侧的内容会发生变化。左侧的每个选项都有一个视图控制器。这些视图控制器嵌入在一个导航视图控制器中(每个视图控制器一个导航视图控制器)。
当用户选择左侧的选项时,将执行转场。它的类型是“替换”,目标是“详细拆分”。
我的问题是每次用户选择左侧的选项时,右侧视图控制器的 viewWillDisappear 都会被调用两次。为什么会这样?
【问题讨论】:
我看到与具有多个详细视图的 UISplitViewController 完全相同的问题。您是否找到了根本原因,理想情况下,您是否找到了可以分享的解决方案?谢谢。 正如我上面评论的,我看到了同样的问题。这似乎与我的详细视图是 UINavigationControllers 的事实有关。如果我将它们设置为只是 UIViews,那么 viewWillDisappear 只会被调用一次。但是,UISplitViewController 需要作为 UIViewControllers 的数组,因此使用 UINavigationController 必须没问题。有什么想法吗? 我没有找到原因,也没有找到解决方案。我的应用程序正在使用它...如您所见,没有人回答这个问题... 感谢您的回复。我将无法忍受它,所以当我想出它时,我会发布我的修复或解决方法...... 发布你的代码,然后才有可能找到错误 【参考方案1】:我也有这个,原来我的问题是我调用了错误的超级方法,在我的情况下,在我覆盖的方法中的 - (void)viewDidDisappear:(BOOL)animated
方法中调用 [super viewDidAppear:animated]
。可能不是你的问题,但以防万一有一天有人偶然发现。
【讨论】:
不是我的问题,但为我指明了正确的方向。我的问题是viewDidDisappear
被调用了两次。原因还在于调用了错误的超级方法:super.viewWillDisappear
而不是 super.viewDidDisappear
。【参考方案2】:
首先,让我说,这很糟糕。我也遇到了这个问题,找到了你的帖子。经过实验,我们意识到-viewDidDisappear:
只被调用一次。因此,导致双重调用的任何错误(当视图控制器位于 SplitView 中的 UINavigationController 内时)似乎都不会发生在 viewDidDisappear 上。
这是一个愚蠢的组合,但这个错误也很愚蠢。希望这会有所帮助。
【讨论】:
【参考方案3】:好的,我花了一段时间调查这个问题,但最后我不得不采取一种解决方法。
在我的情况下,如果“离开”详细视图而不保存详细视图内容,我想显示警报。
我添加了一个实例变量 boolean,最初设置为 false (NO)。
然后,在 viewWillDisappear 中,如果布尔值为 NO,我将其设置为 YES,并显示警报。
然后我将布尔值重置为 NO 是 viewDidDisappear(这也可以在警报回调中完成)。
不是很优雅,但这似乎工作得很好。
- (void) viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
if ([self isDirty] && ![self showingAlert])
[self setShowingAlert:YES];
UIAlertView *alert =
[[UIAlertView alloc]
initWithTitle: @"Save Changes?"
message: @"Use it or lose it, matey."
delegate: self
cancelButtonTitle:@"Save"
otherButtonTitles:@"Don't Save",nil];
[alert show];
[alert release];
- (void) viewDidDisappear:(BOOL)animated
[super viewDidDisappear:animated];
[self setShowingAlert:NO];
【讨论】:
这很脏!但是为什么它会被调用两次呢? 设置断点,检查两次调用路径差异。以上是关于viewWillDisappear 被调用两次的主要内容,如果未能解决你的问题,请参考以下文章
viewWillAppear 和 viewWillDisappear 之间的排序问题
显示 iOS 共享表后未调用 viewWillDisappear
viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序
重写viewWillAppear 和 viewWillDisAppear时[super viewWillAppear] 和 [super viewWillDisappear]的调用位置