Swift - 如何在调用removeFromSuperview()后收到通知?

时间:2017-07-13 11:57:37

标签: ios swift xcode viewcontroller

我有两个视图控制器。应用程序启动时会加载第一个VC,然后如果点击某个按钮,则使用此代码调用secondVC:

    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "tagsStory") as! TagsVC
    self.addChildViewController(popOverVC)
    popOverVC.view.frame = self.view.frame
    self.view.addSubview(popOverVC.view)
    popOverVC.didMove(toParentViewController: self)

在第二个V中,当点击某个按钮时,第二个VC被移除,并且firstVC通过此代码返回给用户:

self.view.removeFromSuperview()

我的问题是,如果在第一个VC中删除了第二个VC,我该如何得到通知?

我尝试使用,viewDidAppear,viewWillAppear,willMove ......但还没有任何效果。

3 个答案:

答案 0 :(得分:1)

在第二个VC中,当点击某个按钮时,第二个VC被删除,并且firstVC返回已经通知您的用户 ,您可以为此设置代理如果案件是一对多,则触发通知。

答案 1 :(得分:1)

UIViewController documentation中介绍了这一点。

你的firstVc是一个容器视图控制器,所以它有一定的责任:

  

在将子视图的根视图添加到视图层次结构之前,容器视图控制器必须将子视图控制器与其自身关联。这允许iOS正确地将事件路由到子视图控制器以及这些控制器管理的视图。同样,在从视图层次结构中删除子视图的根视图后,它应该断开该子视图控制器与其自身的连接。要建立或断开这些关联,容器会调用基类定义的特定方法。这些方法不是由容器类的客户端调用的;它们只能由容器的实现来使用,以提供预期的包含行为。

在添加子视图之前调用didMove(toParentViewControler:)添加第二个视图控制器时,您正在做正确的事情,但在删除子视图后还需要调用removeFromParentViewController()

如果您这样做,那么将调用viewDid/WillDisappear方法。

答案 2 :(得分:0)

如果您只想进行函数调用,只需使用通知即可。在父视图控制器中,注册通知以接收函数调用。

NotificationCenter.default.addObserver(self, selector: #selector(listnerFunction), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

func listnerFunction() {
    tableView.reloadData()
}

完成忘记在视图控制器被销毁时删除此侦听器

deinit {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "notificationName"), object: nil)
}

然后在您的子视图控制器中,当您要从父视图中删除它时,以这种方式调用注册的通知功能

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: nil)