viewWillDisappear被调用两次

时间:2012-04-13 08:27:53

标签: ios

我的应用程序使用带有splitviewcontroller的storyboard。在左侧,我有一个包含选项列表的tableview。在右侧,我有一些关于左侧选项的信息。就像在设置应用程序中一样。当用户选择左侧的选项时,右侧的内容会发生变化。左侧的每个选项都有一个viewcontroller。这些viewcontrollers嵌入在navigationviewcontroller中(每个viewcontroller都有一个navigationviewcontroller)。

当用户选择左侧的选项时,执行segue。它的类型是“替换”,其目的地是“细节分割”。

我的问题是每次用户选择左侧的选项时,右侧视图控制器的viewWillDisappear会被调用两次。为什么会这样?

3 个答案:

答案 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];
}