2010-02-23 176 views
24

我有一个UITableview,我加载数据异步,因此tableview可能会显示没有数据。
我已经厌倦了ReloadData方法,但tableview保持为空,直到我滚动tableview,突然出现数据。
同样的事情发生时,我加载一个tableview作为详细视图和项目之间切换,previoud项目数据首先出现,只要我在表格视图中滚动它显示正确的数据。
我的猜测是ReloadData方法工作得很好,但我需要以某种方式重绘tableview,有关如何解决这个问题的任何建议?更新数据后重绘UITableView异步

/Jimmy

+0

通常reloadData方法刷新tableview的视图。你可以把你的TableViewController代码的样本? – 2010-02-23 23:32:23

回答

53

你说你是异步填充的内容,但你调用reloadData在主线程的上下文? (而不是通过用于填充内容的线程)

目标C

[yourUITableView performSelectorOnMainThread:@selector(reloadData) 
            withObject:nil 
           waitUntilDone:NO]; 

夫特

dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() }) 

MonoTouch的

InvokeOnMainThread(() => this.TableView.ReloadData()); 
+7

感谢解决了它=) 单点触摸的解决方案是: InvokeOnMainThread(()=> this.TableView.ReloadData()); – 2010-02-24 11:37:20

+0

@yonel我和JimmyEngtröm有同样的问题,我真的希望你所说的会做,但唉,我仍然有这个问题。在我更新它所使用的基础数据阵列后,我无法找到刷新UITableView的方法。 – 2011-10-11 07:00:00

+0

@ MasonG.Zhwiti:在您的表数据源的numberOfRowsInSections方法中设置断点,并检查它是否在reloadData之后进入它。然后检查你在这里返回的行数,如果它不是0,那么它将调用cellForRowAtIndex。 – yonel 2011-10-11 07:14:07

2

我想它没有重新加载。

滚动时的细胞出来的画面,然后...

tableView: cellForRowAtIndexPath:

...将被调用。所以它会被重新加载。

我想UITableView变量没有验证。

如果你使用UITableView作为主视图,你可以试试这个。

[self.view reloadData];

[self.tableView reloadData];

4

Yonels答案是完美的,当你的看法是目前可见的用户(如:用户按下一个重载按钮,填入您UITableView)。

但是,如果你的数据异步加载和你UITableView在更新过程中是不可见的(例如:在另一个视图中将数据添加到UITableView,稍后由userinput显示UITableView),只需覆盖UITableViewControllerviewWillAppear方法。

- (void)viewWillAppear:(BOOL)animated{ 
[super viewWillAppear:animated]; 
[self.tableView reloadData]; 
} 

的正面效果是,你只UITableView它重新加载的数据,一旦当用户真正想要的看到它,添加新项目时,不。

2

今天我有类似的问题(故事板iOS 7.0中)。 我在UIViewController里面使用table View。当视图加载的时候一切正常,所有代表都被召集了。但是;当基础数据源(在我的情况下,数组)被修改;可见的表格行没有被更新。它们被更新;只有当我滚动表视图。

试了一下;在主线程上调用reloadData;在ViewWillAppear中调用reload;没有工作。

我发现的问题;是因为我没有在故事板上建立联系;对于带有参考Outlet的表视图。dataSource和delegate已被设置。 我不认为这可能是问题;因为一开始一切工作都很好。

希望它可以帮助别人。我有一些可怕的时间来找到这个。

0

经过在yonel的解决方案中有些天真的复制,并称它很好,我意识到调用performSelectorOnMainThread:withObject:waitUntilDone:修复了症状,但不是问题。更大的问题是,您仍然在异步或后台线程的上下文中进行UI更新。

这就是看起来像我的代码:

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL); 
dispatch_async(queue, ^{ 

    // Make API call 
    // Retrieve data, parse JSON, update local properties 
    // Make a call to reload table data 

}); 

当它应该是这样的:

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL); 
dispatch_async(queue, ^{ 

    // Make API call 
    // Retrieve data, parse JSON, update local properties 

    dispatch_async(dispatch_get_main_queue(), ^{ 
    // Now make the call to reload data and make any other UI updates 
    [self.tableView reloadData] 
    }); 

}); 

如果您需要做的唯一的事就是调用[self.tableView reloadData]它可能是罚款使用performSelectorOnMainThread:withObject:waitUntilDone:,因为它实现了相同的目标,但您也应该认识到大图中发生的事情。此外,如果您正在执行更多的UI工作而不是重新加载表,那么所有代码​​也应该放在主队列中。

参考:A concise example使用GCD和管理背景与主线程。