首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从子UIViewController调用父UIViewController方法

从子UIViewController调用父UIViewController方法
EN

Stack Overflow用户
提问于 2015-05-16 09:33:25
回答 4查看 12.6K关注 0票数 8

我有一个父UIViewController,它打开一个子UIViewController:

代码语言:javascript
复制
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! UIViewController
self.presentViewController(vc, animated: true, completion: nil)

我在ChildView中按一个按钮,它应该关闭ChildView并在父视图中调用一个方法:

代码语言:javascript
复制
self.dismissViewControllerAnimated(true, completion: nil)
CALL PARENTS METHOD  ??????

怎么做?我找到了一个很好的答案(Link to good answer),但我不确定这是否是UIViewControllers的最佳实践。有人能帮忙吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-16 10:20:19

实现这一目标的一个简单方法是使用NSNotificationCenter

ParentViewController中,将其添加到viewDidLoad方法中:

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: Selector(("refresh:")), name:NSNotification.Name(rawValue: "refresh"), object: nil)
}

之后,在ParentViewController中添加这个函数,当您退出ChildViewController时,它将被调用。

代码语言:javascript
复制
func refreshList(notification: NSNotification){

    print("parent method is called")
}

并将以下代码添加到您的ChildViewController中,在其中删除您的子视图:

代码语言:javascript
复制
 @IBAction func btnPressed(sender: AnyObject) {

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refresh"), object: nil)
    self.dismiss(animated: true, completion: nil)
}

现在,当您退出子视图时,将调用refreshList方法。

票数 14
EN

Stack Overflow用户

发布于 2015-05-16 10:04:05

将弱属性添加到子视图控制器,该子视图控制器应包含对父视图控制器的引用。

代码语言:javascript
复制
class ChildViewController: UIViewController {
weak var parentViewController: UIViewController?
....
}

然后在代码中(我假设它在父视图控制器中),

代码语言:javascript
复制
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! ChildViewController
vc.parentViewController = self
self.presentViewController(vc, animated: true, completion: nil)

而且,正如呕吐物所说,在解散您的孩子视图控制器之前,请先调用父母的方法。

代码语言:javascript
复制
parentViewController.someMethod()
self.dismissViewControllerAnimated(true, completion: nil)

或者,您也可以在dismissViewControllerAnimated的完成参数中调用该方法,该方法将在您的子视图控制器解除后运行:

代码语言:javascript
复制
self.dismissViewControllerAnimated(true) {
    parentViewController.someMethod()
}
票数 5
EN

Stack Overflow用户

发布于 2015-05-16 09:40:03

我在您的问题中注意到的一些事情:在退出视图控制器后,不要调用方法(在您的情况下是父方法)。取消视图控制器将导致其被解除分配。以后的命令可能不会执行。

你在问题中包含的链接指向了一个很好的答案。在你的情况下,我会使用授权。在取消子视图控制器之前,在父视图控制器中调用委托方法。

这是一个很好的tutorial

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30274017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档