我的应用程序使用带有splitviewcontroller的storyboard。在左侧,我有一个包含选项列表的tableview。在右侧,我有一些关于左侧选项的信息。就像在设置应用程序中一样。当用户选择左侧的选项时,右侧的内容会发生变化。左侧的每个选项都有一个viewcontroller。这些viewcontrollers嵌入在navigationviewcontroller中(每个viewcontroller都有一个navigationviewcontroller)。
当用户选择左侧的选项时,执行segue。它的类型是“替换”,其目的地是“细节分割”。
我的问题是每次用户选择左侧的选项时,右侧视图控制器的viewWillDisappear会被调用两次。为什么会这样?
答案 0 :(得分:7)
我也有这个,原来我的问题是我正在调用错误的超级方法,在我的情况下,在我重写的方法中调用[super viewDidAppear:animated]
方法中的- (void)viewDidDisappear:(BOOL)animated
。可能不是你的问题,但万一有人偶然发现这一天。
答案 1 :(得分:1)
首先,让我说,这很糟糕。我也遇到了这个问题并找到了你的帖子。经过实验,我们意识到-viewDidDisappear:
只被调用一次。因此,无论是什么错误导致双重调用(当视图控制器位于SplitView中的UINavigationController内时)似乎都不会发生在viewDidDisappear上。
这是一个愚蠢的kludge,但这个bug也是愚蠢的。希望这会有所帮助。
答案 2 :(得分:0)
好的,我花了一段时间调查这个,但最后我不得不采取一种解决方法。
在我的情况下,我想在不保存详细视图内容的情况下“离开”详细视图时显示警告。
我添加了一个实例变量boolean,最初设置为false(NO)。
然后,在viewWillDisappear中,如果布尔值为NO,我将其设置为YES,并显示警告。
然后我将布尔值重置为NO是viewDidDisappear(这也可以在Alert回调中完成)。
不是非常优雅,但这似乎运作得很好。
- (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];
}