【问题标题】:viewWillDisappear is called twiceviewWillDisappear 被调用两次
【发布时间】:2012-04-13 08:27:52
【问题描述】:

我的应用使用带有拆分视图控制器的情节提要。在左侧,我有一个带有选项列表的表格视图。在右侧,我有一些关于左侧选项的信息。就像在设置应用程序中一样。当用户选择左侧的选项时,右侧的内容会发生变化。左侧的每个选项都有一个视图控制器。这些视图控制器嵌入在一个导航视图控制器中(每个视图控制器一个导航视图控制器)。

当用户选择左侧的选项时,将执行转场。它的类型是“替换”,目标是“详细拆分”。

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

【问题讨论】:

  • 我看到与具有多个详细视图的 UISplitViewController 完全相同的问题。您是否找到了根本原因,理想情况下,您是否找到了可以分享的解决方案?谢谢。
  • 正如我上面评论的,我看到了同样的问题。这似乎与我的详细视图是 UINavigationControllers 的事实有关。如果我将它们设置为只是 UIViews,那么 viewWillDisappear 只会被调用一次。但是,UISplitViewController 需要作为 UIViewControllers 的数组,因此使用 UINavigationController 必须没问题。有什么想法吗?
  • 我没有找到原因,也没有找到解决方案。我的应用程序正在使用它...如您所见,没有人回答这个问题...
  • 感谢您的回复。我将无法忍受它,所以当我想出它时,我会发布我的修复或解决方法......
  • 发布你的代码,然后才有可能找到错误

标签: ios


【解决方案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];
    }
    

    【讨论】:

    • 这很脏!但是为什么它会被调用两次呢?
    • 设置断点,检查两次调用路径差异。
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 2016-04-01
    • 2012-05-05
    • 2017-01-19
    • 2014-02-04
    • 2016-12-13
    • 2016-01-30
    • 2015-12-20
    相关资源
    最近更新 更多