从子uiviewcontroller调用父uiviewcontroller方法

时间:2015-05-16 09:33:26

标签: ios swift uiviewcontroller

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

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! UIViewController
self.presentViewController(vc, animated: true, completion: nil)

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

self.dismissViewControllerAnimated(true, completion: nil)
CALL PARENTS METHOD  ??????

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

4 个答案:

答案 0 :(得分:13)

实现此目的的一种简单方法是,您可以使用NSNotificationCenter

ParentViewController中将此添加到viewDidLoad方法中:

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshList:", name:"refresh", object: nil)
}

之后在ParentViewController添加此功能,当您解雇ChildViewController时会调用此功能:

func refreshList(notification: NSNotification){

    println("parent method is called")
}

并在您的ChildViewController添加此代码,以解除您的子视图:

 @IBAction func btnPressed(sender: AnyObject) {

    NSNotificationCenter.defaultCenter().postNotificationName("refresh", object: nil)
    self.dismissViewControllerAnimated(true, completion: nil)
}

现在当您解除子视图时,refreshList方法将被调用。

答案 1 :(得分:5)

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

class ChildViewController: UIViewController {
weak var parentViewController: UIViewController?
....
}

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

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! ChildViewController
vc.parentViewController = self
self.presentViewController(vc, animated: true, completion: nil)

并且,正如vomako所说,在解雇您的子视图控制器之前调用父方法。

parentViewController.someMethod()
self.dismissViewControllerAnimated(true, completion: nil)

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

self.dismissViewControllerAnimated(true) {
    parentViewController.someMethod()
}

答案 2 :(得分:1)

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

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

这是一个很棒的tutorial

答案 3 :(得分:1)

protocol SampleProtocol 
{
    func someMethod()
}   


class parentViewController: SampleProtocol 
{
    // Conforming to SampleProtocol
    func someMethod() {
    }
}

 class ChildViewController
    {
        var delegate:SampleProtocol?
    }

    self.dismissViewControllerAnimated(true, completion: nil)
    delegate?.someMethod()