在函数 ViewWillAppear 中刷新或重新加载数据并不总是在 UITableViewcontroller 中工作

Posted

技术标签:

【中文标题】在函数 ViewWillAppear 中刷新或重新加载数据并不总是在 UITableViewcontroller 中工作【英文标题】:Refresh or reload data in function ViewWillAppear not always working in UITableViewcontroller 【发布时间】:2019-11-09 16:10:07 【问题描述】:

我将一个 UITabbarViewController 设置为我的应用程序的第一个视图,而 UITableViewcontroller 是一个选项卡,这个表视图将显示一些从 URL 响应数据中获取的事务数据。

我所做的是我定义了一个数组作为tableviewcontroller的成员,然后在Viewwillappear中数组数据每次都会刷新,预期的结果是:每当我点击tableview选项卡时,数据都会重新加载或再次刷新。

现在的问题是有时它工作得很好,但有时它显示空白表格视图

我在 *** 中搜索了类似的问题,发现了类似的问题,但提供的解决方案对我不起作用。例如下面

Swift: How to reload new content (eg. array) every time the tableview appears?

下面是我的代码:

class TransactionTableViewController: UITableViewController 

var transactionList = [transactionDetail]()

override func viewDidLoad() 
    super.viewDidLoad()
    self.tableView.dataSource=self
    self.tableView.delegate=self



 override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    //every tap, trigger reload
    reloadTransaction()
    //refresh table view
    self.tableView.reloadData()



internal func reloadTransaction()
    self.transactionList.removeAll()

    //get URL response and append data to transactinList
    ....



override func numberOfSections(in tableView: UITableView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 1


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
    return transactionList.count

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

    //if transactionList.count>0 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TransactionTableViewCell", for: indexPath) as!
        TransactionTableViewCell

    // Configure the cell...

    cell.scanTime.text=transactionList[indexPath.row].scanTime
    cell.productName.text=transactionList[indexPath.row].productName
    cell.productID.text=transactionList[indexPath.row].productID
    cell.location.text=transactionList[indexPath.row].location

    return cell
    //

有什么我想念的吗?我希望数据应该始终正确

【问题讨论】:

您必须在“reloadTransaction()”方法中重新加载表格视图,而不是在 viewWillAppear 方法中。 【参考方案1】:

您应该考虑两件事。如果您的 url 请求尚未处理,则在 reloadTransaction() 之后将立即调用第一次重新加载数据,它将显示一个空的 tableView。

其次,当您有新数据时,请确保在调用 self.tableView.reloadData() 之前调用主线程:

internal func reloadTransaction()
    self.transactionList.removeAll()

    //get URL response and append data to transactinList
    ....
    //call self.tableView.reloadData() here after you append the new data

    DispatchQueue.main.async 
        self.tableView.reloadData()
    

【讨论】:

谢谢!当我将 tableview.reloaddata 放在 reloadtransaction 函数中时,它工作得很好!另外问题是,似乎我仍然将它 reloaddata 放入主线程,是否有一些最佳实践或苹果文档? 不客气。 UI 更新/更改应始终在主线程中完成。因为重载数据,重绘tableview和单元格。它应该在主线程上调用。

以上是关于在函数 ViewWillAppear 中刷新或重新加载数据并不总是在 UITableViewcontroller 中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何刷新视图控制器

Objective C - WebView无法从顶部重新加载

如何在kendo树视图中重新加载或刷新整个分支(父级+子级)

试图在 viewWillAppear 中重新加载数据()

重新加载表视图数据并取消选择单元格

如何在 jQuery 中强制页面刷新或重新加载?