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扩展为具有参数,以指示模式是否完成,取消,成功等。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...