离开并返回视图后,TableView无法正常工作

时间:2019-11-29 20:09:25

标签: ios swift iphone xcode

如果您离开他们的视图并返回,我会对tableView的行为感到困惑。

我有一个带有一个tableView的屏幕,当我第一次进入视图时该屏幕可以工作。添加,删除和更新表格单元格的工作。但是,当我按一个按钮进入下一个视图并立即返回时,tableView不再起作用。应该执行的代码(tableView.reload()和所有关联的方法)按预期运行。但是,即使在内部更新数组,也不会更新屏幕,并且重新加载运行并执行应更新屏幕的代码(即tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell运行正常)。

我想念什么?如果我离开视图并返回ti,tableView是否需要任何特殊处理?

谢谢。

编辑:

tableView类似于以下类的代码:

class DebugViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{

@IBOutlet weak var table: UITableView!
var array    = [M]()

override func viewDidLoad() {
    super.viewDidLoad()
    self.searchbar.delegate = self
    self.table.delegate     = self
    self.table.dataSource   = self
    search_view = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Search_view") as? SomeViewController
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "cellManage") as? TableCellManage else { return UITableViewCell() }

    let idx  = indexPath.row
    let value =  array[idx]

    cell.lbl_time.text             = value.month
    cell.lbl_background.text       = value.color

    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 130
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.array.count
}

@IBAction func tapped_addsongs(_ sender: Any) {
    self.present( search_view, animated: true, completion: nil)
}

}

2 个答案:

答案 0 :(得分:1)

tableView.reload()部分在哪里?由于您尝试在后台线程中更新表,因此可能会产生此问题。所有UI更新必须在主线程中完成:

func someFunc() { 
...
  DispatchQueue.main.async {
   tableView.reload()
  }
...
}

答案 1 :(得分:0)

查看了应用程序生命周期的漂亮图片并进行了谷歌搜索之后,我发现了问题和解决方案。

问题是我设置了侦听器以麻烦的方式更新我的表视图。具体来说,我当时使用viewDidAppear / viewDidDisappear调高和调低了侦听器,因此管理状态的代码中存在一些冲突。

相反,我现在在viewDidLoad上调出侦听器。它们保持活动状态,而不管要推送多少视图(在合理的范围内,但我只推送了一个),并更新我的表视图,以便当我回到该视图时,所有内容都已更新。我什至都看不到更新的发生,它们是在我看到之前发生的。至于分离监听器,有一个方便的功能,直到5分钟前我才知道:deinit。这相当于Swift中的析构函数,因此当我的视图的类对象从内存中释放时,我就分离了侦听器。

这解决了我的问题……并提高了性能,并且我不再因管理好听众而失去联系。因此,双赢。

谢谢大家的帮助!我希望这对其他人有帮助。