关闭关闭子视图控制器后调用 viewdidload
Posted
技术标签:
【中文标题】关闭关闭子视图控制器后调用 viewdidload【英文标题】:viewdidload called after closing dismissing child viewcontroller 【发布时间】: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") 。
【参考方案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 个同名通知。我对它们进行了独特的重命名,现在它可以工作了。非常感谢 。我会接受,因为问题和你的答案都是正确的。以上是关于关闭关闭子视图控制器后调用 viewdidload的主要内容,如果未能解决你的问题,请参考以下文章