我有一个第一个tableViewController,它在单击一个单元格时打开第二个tableViewcontroller。第二个视图控制器以模态方式显示(显示详细信息),并被解除:
self.dismissViewControllerAnimated(true, completion: {})
此时,第二个视图控制器滑开并显示其下方的第一个视图控制器。然后我想重新加载第一个视图控制器。我知道这可能需要使用委托函数,但不确定如何实现它
答案 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的表视图。