viewWillDisappear被调用两次

3
我的应用程序使用带有拆分视图控制器的故事板。在左侧,我有一个包含选项列表的表格视图。在右侧,我有与左侧选项相关的某些信息。就像设置应用程序一样。当用户在左侧选择一个选项时,右侧内容会更改。每个左侧选项都有一个视图控制器。这些视图控制器嵌入在导航视图控制器中(每个视图控制器对应一个导航视图控制器)。
当用户在左侧选择一项时,将执行一个转场(segue)。其类型为“替换”,目的地为“详细信息拆分”。
我的问题是,每次用户在左侧选择一个选项时,会调用右侧视图控制器的viewWillDisappear两次。为什么会发生这种情况?

我也遇到了一个包含多个详细视图的UISplitViewController的完全相同的问题。你找到了根本原因,最好能分享一下解决方案吗?谢谢。 - Snips
正如我之前所评论的,我遇到了同样的问题。这似乎与我的详细视图/ s是UINavigationControllers有关。如果我将它们设置为只是UIView,则viewWillDisappear仅被调用一次。然而,UISplitViewController期望一个UIViewController数组,因此使用UINavigationController应该是可以的。有什么想法吗? - Snips
我既没有找到原因也没有解决方案。我的应用程序只能忍受它...正如你所看到的,没有人回答这个问题... - Carlos
感谢回复。我不能容忍这种情况,所以一旦我想出解决方法或变通方案,我会发布它。 - Snips
发布你的代码,然后才能找到错误。 - CoolMonster
3个回答

7

我也遇到过这个问题,后来发现我的问题在于我调用了错误的父类方法,在我重写的方法中调用了[super viewDidAppear:animated],而应该是在- (void)viewDidDisappear:(BOOL)animated方法之内。也许不是你的问题,但以防万一,留下这条信息。


不是我的问题,但指引了我正确的方向。我的问题在于 viewDidDisappear 被调用了两次。原因也是因为调用了错误的父类方法:super.viewWillDisappear 而不是 super.viewDidDisappear - Chuck Boris

1
首先,让我说,这很糟糕。我也遇到了这个问题,并找到了您的帖子。经过试验,我们意识到 -viewDidDisappear: 只会被调用一次。因此,不管是什么错误导致了双重调用(当视图控制器位于拆分视图中的 UINavigationController 中时),似乎并没有发生在 viewDidDisappear 上。
这是一个愚蠢的替代方法,但错误也很愚蠢。希望这可以帮助您。

0

好的,我花了一段时间来调查这个问题,但最终我不得不采用一个解决方法。

在我的情况下,如果在不保存详细视图内容的情况下“离开”详细视图,我想显示一个警报。

我添加了一个实例变量布尔值,最初设置为false(NO)。

然后,在viewWillDisappear中,如果布尔值为NO,我将其设置为YES,并显示警报。

然后我在viewDidDisappear中将布尔值重置为NO(这也可以在警报回调中完成)。

这并不是非常优雅,但这似乎足够好用。

- (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];
}

那真是太糟糕了!但为什么它会被调用两次? - Kyle Clegg
1
设置断点,并检查两次调用路径的差异。 - simalone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接