【问题标题】:Call reloadData() to refresh TableView - Reusable Code调用 reloadData() 刷新 TableView - 可重用代码
【发布时间】:2020-08-02 17:37:19
【问题描述】:

在通过 textView 添加一行后,我需要 tableView 执行 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
        }
    }

下面的函数使用可重用代码来显示工作正常的表格。

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。当用户完成他们的输入时,他们点击“保存”按钮,该按钮通过展开返回到 DetailViewController。保存 selectedEntry 并更新 dataModel。现在表格视图需要重新加载以显示此添加的文本。

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

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

   func doReload(){
       tableView.reloadData()
    }

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

感谢任何帮助。

【问题讨论】:

    标签: ios swift uitableview code-reuse


    【解决方案1】:

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

    例如:

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

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

    Apple Documentation - UITableView.reloadData():

    为了提高效率,表格视图只重新显示那些 可见。

    【讨论】:

    • 感谢您的帮助。我不断收到“关键代码投诉”错误,因此我将可重用的 TableView 代码移动到DetailedViewController 中的扩展,并将tableView 附加为IBOutlet。现在可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多