在主线程上调用 tableView.reloadData 后 UITableView 不刷新

Posted

技术标签:

【中文标题】在主线程上调用 tableView.reloadData 后 UITableView 不刷新【英文标题】:UITableView not refreshing after calling tableView.reloadData on main thread 【发布时间】:2017-01-28 19:03:44 【问题描述】:

更新:我对 let vc = viewControllers(for: self) 的调用返回了错误的值,因此没有触发更新。

我正在尝试使用tableView.reloadData 方法更新UITableView,但它没有触发更新?

当单击搜索结果时从父视图控制器调用selectAndHighlight 时应该会发生更新

我四处搜索,据我所知,我需要在主线程上调用更新,所以我已经这样做了,但我仍然没有得到任何更新?

从长远来看,我可能只想更新一个单元格,但现在,我只想更新任何内容,这是行不通的。在 reload 命令期间,我的 print 语句没有日志输出。

当我将内容从屏幕上滚动出来然后重新打开时,新内容正确存在,因此数据正在正确同步,只是没有更新。

import UIKit
import RealmSwift
import XLPagerTabStrip

class ArtistViewControllerTableViewController: UITableViewController, IndicatorInfoProvider 

open var stageName = ""

var artists: Results<Artist>!

override func viewDidLoad() 

    let realm = try! Realm()

    artists = try! realm.objects(Artist.self).filter("stageName = '" + stageName + "'")

    super.viewDidLoad()



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

    let cell = tableView.dequeueReusableCell(withIdentifier: "ArtistCell", for: indexPath)
    as! ArtistCellTableViewCell

    let artist = artists[indexPath.row] as Artist

    cell.artist = artist

    print ("updating " + artist.artistName)

    return cell


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    print("Artist Clicked")


open func selectAndHighlight(artist: Artist) 

    print (stageName)

    DispatchQueue.main.async 

        let realm = try! Realm()

        try! realm.write 
            artist.artistName = "new name"
        

        self.tableView.reloadData()

     
  

override func numberOfSections(in tableView: UITableView) -> Int 
    return 1


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


func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo 
    return IndicatorInfo(title: stageName)


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


在点击搜索结果后最终调用 SelectAndHighlight 方法的扩展。

extension ParentViewController: HandleSearchResultClick
func select(artist: Artist) 
    print(artist.artistName + " clicked")
    var x = 0

    let vc = viewControllers(for: self)
    let table = vc[x] as? ArtistViewControllerTableViewController
    table?.selectAndHighlight(artist: artist)     


【问题讨论】:

你在哪里调用 selectAndHighlight? 在管理所有选项卡的父视图控制器中。它通过一个协议,并且该协议正在工作。 print(stageName) 触发,它是正确的打印。我更新了帖子以提及协议 抱歉,这不是协议,只是我在单击搜索结果时获得了对视图控制器的引用。让表 = vc[x] 作为? ArtistViewControllerTableViewController 表?.selectAndHighlight(艺术家:艺术家) 您的 ParentViewController 对 tableView 一无所知,因此它无法重新加载其数据,您应该以某种方式将其传递给 ParentViewController,例如使用 segue ParentViewController 是 ButtonBarPagerTabStripViewController 的子类,它基本上知道它的所有子视图控制器。我基本上是在某个位置访问孩子,即 UITableViewController。正在调用正确视图控制器中的 SelectAndHighlight 方法,所以这对我来说似乎正确吗?为什么它可以调用方法而不更新表? 【参考方案1】:

在调用tableView.reloadData()之前尝试调用下面的函数

func refreshArtistsObj()
    let realm = try! Realm()
    artists = try! realm.objects(Artist.self).filter("stageName = '" + stageName + "'")

问题是在向 RealmDB 添加值之后,您需要获取更新的值并再次更新您的艺术家对象。

【讨论】:

那不行。数据正在正确刷新而我没有调用领域列表的更新,它是在我调用 reloadData 后没有调用“tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell”

以上是关于在主线程上调用 tableView.reloadData 后 UITableView 不刷新的主要内容,如果未能解决你的问题,请参考以下文章

为啥在主线程上调用东西是程序员的责任?

-[GCKCastDeviceProvider stopDiscovery] 必须在主线程上调用

iOS - 确保在主线程上执行[重复]

csharp 在主线程上调用

在主线程上调用 tableView.reloadData 后 UITableView 不刷新

tableView.reloadData() 不起作用,可能没有在主线程上调用