模态关闭后重新加载主视图

Reload main view after modal dismiss

在我的 Xcode-App 中,可以从每个视图打开一个模式。每个 'base' 视图都有不同的目的,有些显示 table,有些则没有。每当模式被关闭时,我如何才能重新加载 'base' 视图?

这似乎特别棘手,因为视图具有如此不同的结构和目的。我尝试了 viewWillAppearviewDidAppearviewDidLoad,但其中 none 似乎可以解决问题。

您可以设置委托模式,以便您的模态视图可以通知它何时消失或消失。

首先您需要为您的委托创建一个协议:

protocol ModalViewControllerDelegate: class {
    func modalControllerWillDisapear(_ modal: ModalViewController)
}

然后你的模式应该有一个委托 属性(最终将成为呈现控制器)并在需要时触发 modalControllerWillDisapear 方法:

final class ModalViewController: UIViewController {
    weak var delegate: ModalViewControllerDelegate?

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        delegate?.modalControllerWillDisapear(self)
    }
}

所有将呈现模态控制器的视图控制器都必须遵守该协议,并在呈现时将自己指定为模态的委托:

final class SomeViewController: UIViewController {
    private func presentModalController() {
        let modal = ModalViewController()
        modal.delegate = self
        self.present(modal, animated: true)
    }
}

extension SomeViewController: ModalViewControllerDelegate {
    func modalControllerWillDisapear(_ modal: ModalViewController) {
        // This is called when your modal will disappear. You can reload your data.
        print("reload")
    }
}

注意:如果您使用 segues 来呈现您的模式,您可以在 prepare(for:sender:) 方法中分配委托 属性 而不是在自定义中方法。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch (segue.identifier, segue.destination) {
        // Check that the segue identifer matches and destination controller is a ModalViewController
    case ("showModalSegue", let destination as ModalViewController):
        destination.delegate = self
    case _:
        break
    }
}