在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview

Posted

技术标签:

【中文标题】在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview【英文标题】:Reload custom tableview on UIView data after another view controller unwind segue 【发布时间】:2017-11-07 05:18:01 【问题描述】:

在另一个视图控制器完成保存文件并展开到 tableview 后,我一直在尝试重新加载数据

顺便说一句,由于这个tableview是在UIViewController上创建的,所以我在尝试放入tableview.reload()后得到了这个错误

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x7ffedffbcfa8)

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    tableView.reloadData()
    return fileURLs.count

我猜这样做可能会导致无限循环并永远保持reloadData?

实现此方法的正确方法是什么?

编辑

    override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(true)
    tableView.reloadData()

@IBAction func unwindToCSVList(sender: UIStoryboardSegue) 
    //tableView.reloadData()

无论哪种方式都不起作用,这与我的 UITableView 代表有关吗?

【问题讨论】:

有可能,该表正在重新加载,但您传递的数组可能不会更新。 @DipakKacha 是的!我解决了。谢谢,如你所说 正如@DipakKacha 所说“您传递的数组可能不会更新”,您应该使用委托方法将更新的数据传递给第一个控制器,然后更新数组内的数据并在之后重新加载表或重新- 调用 API。 @Mr.Bista,当他使用 unwind segue 时,我们可以从 segue 传递任何东西。那么为什么要使用委托或任何其他额外的代码呢? @Mr.Bista,没错。 【参考方案1】:

tableView.reloadData() 导致对numberOfRowsInSection 的调用,反之亦然。你猜对了:无限循环。

您可以执行以下操作:

    创建一个委托,它将由第一个控制器遵守。 第二个控制器将调用委托方法并在其中重新加载表。

代表示例:get indexPath of UITableViewCell on click of Button from Cell

或者简单的方法。

ViewWillAppearviewDidAppear 方法中调用tableView.reloadData()

【讨论】:

将 tableView.reloadData() 放入 viewWillAppear 或 viewDidAppear 从 VC2 展开后仍无法重新加载 如果来自 VC2 的展开 segue 在 VC1 中调用动作 (A),则将 tableView.reloadData() 放入动作 A。

以上是关于在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview的主要内容,如果未能解决你的问题,请参考以下文章

展开后执行segue

使用 segue 向后导航时如何重新加载容器视图?

展开 segue 后,swift 2 搜索栏不会隐藏

如何在 Xcode 中展开 segue

(Swift)当多个视图控制器导致相同的视图时展开 segue?

从自定义导航栏展开 segue 后,如何切换回默认导航栏外观?