在Swift中关闭模式呈现的视图控制器后,如何重新加载ViewController?

A_t*_*ter 5 xcode uitableview uiviewcontroller ios

我有一个第一个tableViewController,它在单击一个单元格后会打开第二个tableViewcontroller。第二个视图控制器以模态显示(“显示详细信息”序列),并通过以下方式关闭:

self.dismissViewControllerAnimated(true, completion: {})
Run Code Online (Sandbox Code Playgroud)

此时,第二个视图控制器滑开并露出下面的第一个视图控制器。然后,我想重新加载第一个视图控制器。我了解这可能需要使用委托函数,但不确定如何实现

小智 5

我的解决方法有点不同,因为我不想要那种依赖性。

这种方法是在您以模态方式呈现控制器时使用的,因为当您关闭呈现的控制器时,呈现的控制器不会重新加载。

无论如何解决!

相反,你创建一个单例(中介)

protocol ModalTransitionListener {
    func popoverDismissed()
}

class ModalTransitionMediator {
    /* Singleton */
    class var instance: ModalTransitionMediator {
        struct Static {
            static let instance: ModalTransitionMediator = ModalTransitionMediator()
        }
        return Static.instance
    }

private var listener: ModalTransitionListener?

private init() {

}

func setListener(listener: ModalTransitionListener) {
    self.listener = listener
}

func sendPopoverDismissed(modelChanged: Bool) {
    listener?.popoverDismissed()
}
}
Run Code Online (Sandbox Code Playgroud)

您的呈现控制器是否实现了这样的协议:

class PresentingController: ModalTransitionListener {
//other code
func viewDidLoad() {
    ModalTransitionMediator.instance.setListener(self)
}
//required delegate func
func popoverDismissed() {
    self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
    yourTableViev.reloadData() (if you use tableview)
}
}
Run Code Online (Sandbox Code Playgroud)

最后在您的 PresentedViewController 中的 viewDid/WillDisappear 函数或自定义函数中添加:

ModalTransitionMediator.instance.sendPopoverDismissed(true)
Run Code Online (Sandbox Code Playgroud)


小智 5

斯威夫特 5:

您可以访问呈现视图控制器 (presentingViewController) 属性,并在视图消失时使用它重新加载表视图。

class: FirstViewController {
    var tableView: UITableView

    present(SecondViewController(), animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

在第二个视图控制器中,您可以在 viewWillDisappear 方法中添加以下代码:

class SecondViewController {
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        if let firstVC = presentingViewController as? FirstViewController {
            DispatchQueue.main.async {
                firstVC.tableView.reloadData()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当您关闭 SecondViewController 时,FirstViewController 的 tableview 将重新加载。