调用 reloadData() 刷新 TableView - 可重用代码

Call reloadData() to refresh TableView - Reusable Code

我需要 tableView 在通过 textView 添加一行后执行 reloadData()。我的 tableViews 都使用工作正常的可重用代码。 下面是我的可重用 TableViewCode。

class ReusableSubtitleTable: NSObject, UITableViewDataSource, UITableViewDelegate{
        let cell = "cell"
        var dataArray = [String]()
        
        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) {
            print("DataArray count from table view = \(dataArray.count)")
            return dataArray.count
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let selfSizingCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SelfSizingCell
            let num = indexPath.row
            selfSizingCell.titleText.text = (stepText[num])
            selfSizingCell.subtitleText.text = dataArray[num]
            return selfSizingCell
        }
    }

下面的函数使用可重复使用的代码来显示 table,效果很好。

class DetailViewController: UIViewController {
     
    let step = 13
    var tableView: UITableView!
    let dataSource = ReusableSubtitleTable()
    var selectedEntry: JournalEntry!
    var dataModel = [String]()
    var didSave = false
    var coreDataManager = CoreDataManager()
     
     override func viewDidLoad() {
            super.viewDidLoad()
            tableView.delegate = dataSource
            tableView.dataSource = dataSource
            dataSource.dataArray = dataModel
     
    @IBAction func unwindToDetail( _ sender: UIStoryboardSegue) {
            dataModel[10] = step11
            didSave = coreDataManager.updateEntry(step11: step11, selectedEntry: selectedEntry)
}
}

当用户想要添加到最后一行时,问题就出现了。用户点击一个按钮,然后被带到下一个控制器,它是一个 TextView。当用户完成他们的输入时,他们点击 'Save' 按钮,该按钮通过展开 returned 到 DetailViewController。 selectedEntry 被保存并且 dataModel 被更新。现在 table 视图需要重新加载才能显示添加的文本。

我试过在 didSave 之后添加 tableView.ReloadData()。我已经尝试过 Dispatch 并尝试在 return 通过展开从 textView 中保存数据,但这也不起作用。

我尝试将以下函数添加到 ReusableTableView 并在核心数据更新后调用它 - 没有错误,但它不会重新加载 table。

   func doReload(){
       tableView.reloadData()
    }

我已验证数据已保存,如果我 return 到摘要控制器然后继续 DetailViewController,它会显示。

感谢任何帮助。

UITableView reloadData() 放在 viewWillAppearviewDidAppear 中应该可以解决这个问题。

例如:

func viewDidAppear(_ animated: bool) {
    super.viewDidAppear(animated)
    tableView.reloadData()
}

这是因为视图层次结构在 segue 展开期间尚未被视为“可见”,以及为什么您通过返回重新加载视图控制器来看到它起作用。 reloadData() 函数,为了提高效率,只重新显示可见的单元格,并且在展开时单元格不是“可见的”。

Apple Documentation - UITableView.reloadData():

For efficiency, the table view redisplays only those rows that are visible.