如何解决Swift:在外部类中触发的UITableView元素中重新加载数据
我正在尝试使用方法reloadData()
调用viewDidDisappear()
方法来更新外部类(不同的视图控制器)中的表视图。
加载或显示表所在的视图时,我已经可以更新它了:
class OrderHistoryController: UIViewController,UITableViewDataSource,UITableViewDelegate {
@IBOutlet var orderTable: UITableView!
//called when order table is loaded or appears
override func viewDidLoad() {
super.viewDidLoad()
self.orderTable.delegate = self
self.orderTable.dataSource = self
self.orderTable.reloadData()
}
override func viewDidAppear(_ animated: Bool) {
self.orderTable.delegate = self
self.orderTable.dataSource = self
self.orderTable.reloadData()
}
// ...
}
但是我希望在其他视图消失时重新加载表。
class OrderDocumentationController: UIViewController {
override func viewDidDisappear(_ animated: Bool) {
OrderHistoryController().orderTable.reloadData()
return
}
// ...
}
我收到致命错误:
意外地发现nil,同时隐式展开一个Optional值。
猜猜这只是菜鸟的错误。有任何想法吗?预先谢谢你!
解决方法
调用OrderHistoryController().orderTable.reloadData()
时,这将创建一个新的OrderHistoryController
实例,该实例将没有连接orderTable
插座,从而导致崩溃。
有多种方法可以实现您想要的:
- 存储对
OrderHistoryController
实例的引用并使用它 - 也许更好:实施一些自定义委派机制
- 使用
NotificationCenter
发送一条消息,然后刷新该消息
如果OrderDocumentationController消失时出现OrderHistoryController,则无需重新加载orderTable。由于self.orderTable.reloadData()在OrderHistoryController :: viewDidAppear()中被调用
更新:
一种更好的方法是让OrderDocumentationController提供一个模态控制器完成时调用的块。
因此,在OrderDocumentationController中,提供一个名为onDoneBlock的块属性。
在OrderHistoryController中,您显示如下:
-
在OrderHistoryController中,创建OrderDocumentationController
-
将OrderDocumentationController的完成处理程序设置为:OrderDocumentationController.onDoneBlock = {[OrderDocumentationController dismissViewControllerAnimated:YES完成:无]};
-
使用[self OrderDocumentationController animation:YEScomplete:nil]正常显示OrderDocumentationController控制器。
-
在OrderDocumentationController中,在取消目标操作中调用self.onDoneBlock();
结果是OrderDocumentationController告诉完成它的人。您可以将onDoneBlock扩展为具有参数,以指示模式是否完成,取消,成功等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。