【问题标题】:viewdidload called after closing dismissing child viewcontroller关闭关闭子视图控制器后调用 viewdidload
【发布时间】:2015-08-04 13:22:23
【问题描述】:

我有一个主视图控制器和一个子视图控制器。

我意识到在关闭 Childviewcontroller 时像:

        self.dismissViewControllerAnimated(true, completion: {
            self.dismissViewControllerAnimated(true, completion: nil);
        });

它只会关闭子视图控制器,我可以看到主视图控制器。不处理其他代码

如果我关闭子视图控制器并通知主视图控制器:

                self.dismissViewControllerAnimated(true, completion: {
                    NSNotificationCenter.defaultCenter().postNotificationName("refreshtextviewer_with_bookmark", object: nil);
                    self.dismissViewControllerAnimated(true, completion: nil);

                });

然后我的 refreshtextviewer_with_bookmark() 函数在主视图控制器中被调用,同时标准 viewDidLoad() 也被调用。

这是正常行为吗,在这种情况下 viewDidLoad() 在关闭子 viewcontroller 后被调用?有没有办法防止这种情况发生?

【问题讨论】:

  • 哪个viewDidLoad,父母还是孩子? refreshtextviewer_with_bookmark 的监听器有什么代码?
  • viewDidLoad 被主视图控制器调用。为了简化这个例子,我只有一个 println("test") 。

标签: ios swift uiviewcontroller


【解决方案1】:

不应在解雇后调用。经过测试,确实没有调用。

这是一个简单的例子:

家长

类视图控制器:UIViewController { 覆盖 func viewDidLoad() { super.viewDidLoad() println(__FUNCTION__) NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshtextviewer_with_bookmark", name: "refreshtextviewer_with_bookmark", object: nil) } 初始化{ NSNotificationCenter.defaultCenter().removeObserver(self) } @IBAction func buttonTap(sender: AnyObject) { 让 vc = self.storyboard?.instantiateViewControllerWithIdentifier("childVC") as!子视图控制器 self.presentViewController(vc,动画:真,完成:无) } func refreshtextviewer_with_bookmark() { println(__FUNCTION__) } }

孩子

类 ChildViewController: UIViewController { @IBAction func exitTap(sender: AnyObject) { self.dismissViewControllerAnimated(true, completion: { () -> Void in NSNotificationCenter.defaultCenter().postNotificationName("refreshtextviewer_with_bookmark", object: nil) }) } }

FYI __FUNCTION__ 宏被替换为函数名。

【讨论】:

  • 非常感谢您的测试。但在我的情况下确实如此。任何千分之一。似乎在解雇孩子后启动了一个新的主视图控制器。我通过在 viewDidLoad 之后将 Main 中的变量(默认为 false)设置为 true 来测试这一点。在解雇孩子并再次处理 viewDidLoad 后,变量再次为假。
  • 你在导航视图控制器中推送它吗?请发布您如何从父母那里调用孩子。
  • 我刚刚发现。我的通知很混乱。我在调用相同子视图控制器的 2 个主视图控制器中有 2 个同名通知。我对它们进行了独特的重命名,现在它可以工作了。非常感谢 。我会接受,因为问题和你的答案都是正确的。
猜你喜欢
  • 2017-04-07
  • 2018-12-07
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2020-02-17
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多