来自父ViewController的swift 3调用函数

时间:2016-11-21 07:53:32

标签: ios class swift3 protocols uicontainerview

我有一个ViewController,这个视图容器有一个创建2个容器视图的类,并向第一个容器添加一个表,为第二个容器添加一个HashtagPicker。

hashTagPicker有一个函数,只要发生对所选hashTag的更改,就会调用该函数。

问题:我想在更改标记时调用更新表函数。如何从包含容器的类中定义的hashtagclass调用函数?

3 个答案:

答案 0 :(得分:4)

您可以使用上述答案中提到的代理人。或者您可以使用通知。所以这是一个使用通知的解决方案。

首先在您的父viewController的viewDidLoad中注册一个通知

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ParentViewController.someActionToBePerformed), name: "myNotification", object: nil)

在父视图中创建一个与上面名称相同的函数,它就像

func someActionToBePerformed () {
    // this will be called when hashTag is changed
    // do something when hashTag is changed 
}

现在,您只需发布来自您的标签viewController的通知即可。当你想这样的时候。

NSNotificationCenter.defaultCenter().postNotificationName("myNotification", object: nil)

答案 1 :(得分:2)

我个人喜欢委托方法而不是通知 - 后一种解决方案几乎总会导致令人困惑的架构。遗憾的是,委托方法的例子,也是公认的答案,更糟糕 - 它基本上为内存泄漏提供了机会。我会解释一下。在公认的解决方案中,ParentView强烈引用了HashtagPicker,而HastagPicker依次强调ParentView,这会创建一个保留周期和方法这两个控制器都不会被ARC接收并被取消初始化。因此,例如,如果您是从其他视图中展示ParentView并继续ParentView然后返回,则会继续生成ParentView的新实例(和{{1}与旧的仍然占据记忆。

现在,应该如何做到这一点。我将使用与接受的答案中完全相同的名称。

协议的定义如下:

HashtagPicker

如果我们指定// note the ": class" part protocol HashTagPickerDelegate: class { func picked(hashtag: String) } ,则表示该协议只能用于类。这将允许用于创建弱引用,否则这将是不可能的。

class

现在我们对委托有一个弱引用,所以没有保留周期,ARC可以很好地清理所有内容!

我会抛出剩下的代码,将其作为一个完整的答案:

class HashtagPicker: UIViewController {
  // if HashTagPickerDelegate wouldn't be limited to class, 
  // we couldn't have made a weak reference here!
  weak var delegate: HashTagPickerDelegate?

  // at some point, you call the delegate, it can be anywhere, this is just an example
  @IBAction func tappedHashtag(_ sender: Any) {
    delegate?.picked(hashtag: "bla")
  }
}

答案 2 :(得分:0)

您可以使用此功能(无通知,无委托)

 func exitButtonTapped() {
    if let pdfVC : YourParnetViewController = self.parent as? YourParnetViewController {
        pdfVC.removeBlurEffect()
        self.removeFromParentViewController()
        self.view.removeFromSuperview()
    }
}