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

UITest 中断处理程序调用 tap() 两次

viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序

重写viewWillAppear 和 viewWillDisAppear时[super viewWillAppear] 和 [super viewWillDisappear]的调用位置

按主页按钮时视图消失