弹出窗口关闭时如何在主视图控制器中快速运行代码

Posted

技术标签:

【中文标题】弹出窗口关闭时如何在主视图控制器中快速运行代码【英文标题】:How to run code in your main view controller in swift when a pop up closes 【发布时间】:2018-05-09 17:51:47 【问题描述】:

我目前正在编写我的第一个 swift 应用程序。目前有一个视图/视图控制器在应用程序运行时加载,以及一个绑定到单独视图控制器的弹出窗口(如:https://www.youtube.com/watch?v=S5i8n_bqblE)。当我关闭弹出窗口时,我想更新原始视图上的一些内容并运行一些代码。但是, func viewDidLoad() 和 func viewDidAppear() 似乎都没有运行。而且我无法从弹出视图中执行任何操作,因为我无法从中访问主视图控制器中的组件。我该怎么办?

如果有影响,弹出窗口是“模态呈现”吗?

【问题讨论】:

你的 viewWillAppear 会在这里被调用。 感谢您的建议,但 viewWillAppear 似乎也没有运行。 【参考方案1】:

我假设您有一个 MainViewController 来展示 PopupVC。您可以在此处使用委托模式。 如下定义一个 PopupVCDelegate

protocol PopupVCDelegate 
    func popupDidDisappear()

在您的 PopupVC 中定义 delegate 类型为 PopupVCDelegate 的属性。并在closePopup方法中调用委托方法popupDidDisappear

class PopupVC: UIViewController 
    public var delegate: PopupVCDelegate?

    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBAction func closePopup(_ sender: Any) 
        dismiss(animated: true, completion: nil)
        delegate?.popupDidDisappear()
    

现在任何采用delegate 的类都可以在调用closePopup 时接收回调。所以让你的 MainViewController 采用这个委托。

class MainViewController: UIViewController, PopupVCDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()
    

    func showPopup() 
        let popupViewController = //Instantiate your popup view controller
        popupViewController.delegate = self
        //present your popup
    

    func popupDidDisappear() 
        //This method will be called when the popup is closed
    

另一种方法是通过NSNotificationCenterclosePopup 上触发通知,并在 MainViewController 中添加一个观察者来收听该通知。但不建议在这种情况下使用。

编辑

正如您所要求的 NSNotificationCenter 方法。请按照以下方式更改您的课程

class PopupVC: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBAction func closePopup(_ sender: Any) 
        dismiss(animated: true, completion: nil)

        NotificationCenter.default.post(name: NSNotification.Name("notificationClosedPopup"), object: nil)
    
  
class MainViewController: UIViewController, PopupVCDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()

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

    @objc func onPopupClosed() 
        //This method will be called when the popup is closed
    

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

【讨论】:

谢谢。但是,当我将此添加到我的代码中时,“popupViewController.delegate = self”行会产生错误消息“变量在其自己的初始值中使用” 另外,即使您建议不要使用第二种方法(在 ClosePopup 上使用 NSNotificationCenter),我也将不胜感激(来自您或其他知识渊博的人)有关如何实施此方法的信息。 我已经编辑了我的答案以包含 NSNotificationCenter 方法。您可以使用该方法在弹出窗口关闭时接收通知。 至于您的“在其自己的初始值中使用的变量”错误消息,我认为您正在将 'self' 分配给 'init' 方法中的委托,而 'self' 当时没有完全初始化.如果是这种情况,那么您可以将代码移动到 viewDidLoad。 非常感谢。不幸的是,我移动代码后错误消息仍然存在。第二种方法虽然没有错误!不幸的是“onPopupClosed()”没有运行。这可能与模态显示的弹出窗口有关吗?

以上是关于弹出窗口关闭时如何在主视图控制器中快速运行代码的主要内容,如果未能解决你的问题,请参考以下文章

单击 uibutton 时关闭弹出窗口

如何从弹出视图中关闭第二个视图控制器

在后台点击 Swift 时禁用关闭弹出框

关闭弹出视图

如何关闭视图控制器并快速弹出到根视图控制器?

如何关闭已呈现未推送的多个视图控制器?