如何在Swift中解除模态显示的视图控制器后重新加载ViewController?

时间:2015-02-24 21:40:52

标签: ios xcode uitableview uiviewcontroller

我有一个第一个tableViewController,它在单击一个单元格时打开第二个tableViewcontroller。第二个视图控制器以模态方式显示(显示详细信息),并被解除:

self.dismissViewControllerAnimated(true, completion: {})

此时,第二个视图控制器滑开并显示其下方的第一个视图控制器。然后我想重新加载第一个视图控制器。我知道这可能需要使用委托函数,但不确定如何实现它

3 个答案:

答案 0 :(得分:4)

您可以在viewDidAppear:中简单地自动加载数据,但这可能会导致在某些情况下不必要地刷新表格。

更灵活的解决方案是使用正确猜测的协议。

假设您的第一个tableViewController的类名是Table1VC,第二个是Table2VC。您应该定义一个名为Table2Delegate的协议,该协议将包含一个方法,例如table2WillDismissed

protocol Table2Delegate {
    func table2WillDismissed()
}

然后,您应该使Table1VC实例符合此协议,并在委托方法的实现中重新加载表。

当然为了实现这一点,您应该向Table2VC添加一个属性来保存代理:

weak var del: Table2Delegate?

并将其值设置为Table1VC实例。

设置委托后,只需在调用dismissViewControllerAnimated实例中的Table2VC之前添加对委托方法的调用。

del?.table2WillDismissed()
self.dismissViewControllerAnimated(true, completion: {})

这将使您可以精确控制何时重新加载表格。

答案 1 :(得分:2)

我解决了一点不同,因为我不想要那种依赖。

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

无论如何解决方案!

相反,你制作一个单身人士(中间人)

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()
}
}

你有没有呈现控制器实现这样的协议:

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)
}
}

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

ModalTransitionMediator.instance.sendPopoverDismissed(true)

答案 2 :(得分:0)

快捷键5:

您可以访问presenting ViewController(presentingViewController)属性,并在视图消失时使用它重新加载表视图。

class: FirstViewController {
    var tableView: UITableView

    present(SecondViewController(), animated: true, completion: nil)
}

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

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

        if let firstVC = presentingViewController as? FirstViewController {
            DispatchQueue.main.async {
                firstVC.tableView.reloadData()
            }
        }
    }
}

关闭SecondViewController时,将重新加载FirstViewController的表视图。