我已经制作了一个带有TableView的UIViewController,里面显示来自服务器的东西,我的代码是这样的:
- (void) viewDidLoad{
[super viewDidLoad];
NSUserDefaults *userDefaults = [UserDefaults instance];
[Async activitiesForPersonId:[userDefaults objectForKey:USERDEFAULTS_PERSONID]
unionId:[userDefaults objectForKey:USERDEFAULTS_UNIONID]
callback:^(NSArray *activities){
if(activities && [activities count] != 0){
NSLog(@"%hhd",[NSThread isMainThread]); //1
NSLog(@"%i", [activities count]); //16
self.activities = activities;
}else{
NSLog(@"What the ...."); //Doesn't get printed
}
}];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.activities count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier = @"CalendarActivity";
CalendarCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
return cell;
}
屏幕上怎么没有显示。当我将[self.activities count]更改为例如硬编码5时,它会显示5个单元格。所以我想我已经通过IB正确设置了数据源。此外,数据来自另一个线程,但在主线程上返回它也可能不是问题。
答案 0 :(得分:1)
你实际上并没有在细胞中设置任何东西。例如:
- (void)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Set up cell stuff
cell.textLabel.text = @"Title For Cell";
return cell;
}
编辑:
您可能需要在数据准备好显示后重新加载tableView,[tableView reloadData];
应该为您执行此操作。
答案 1 :(得分:1)
您必须在异步函数完成时执行的回调中重新绑定tableview:
- (void) viewDidLoad{
[super viewDidLoad];
NSUserDefaults *userDefaults = [UserDefaults instance];
[Async activitiesForPersonId:[userDefaults objectForKey:USERDEFAULTS_PERSONID]
unionId:[userDefaults objectForKey:USERDEFAULTS_UNIONID]
callback:^(NSArray *activities){
if(activities && [activities count] != 0){
NSLog(@"%hhd",[NSThread isMainThread]); //1
NSLog(@"%i", [activities count]); //16
self.activities = activities;
//add this line:
[self.tableView reloadData];
}else{
NSLog(@"What the ...."); //Doesn't get printed
}
}];
}
答案 2 :(得分:1)
此外,数据来自另一个线程但在主线程上返回,因此可能也不是问题。
实际上,这是你的问题。如果添加一些断点,我相信你会在异步回调处理程序之前看到numberOfRowsInSection被调用。在异步回调块的末尾的主线程中重新加载tableView数据,你应该没问题。
答案 3 :(得分:1)
你必须调用[tableView reloadData]; 在viewDidLoad中更改您的代码:
- (void) viewDidLoad{
[super viewDidLoad];
NSUserDefaults *userDefaults = [UserDefaults instance];
[Async activitiesForPersonId:[userDefaults objectForKey:USERDEFAULTS_PERSONID]
unionId:[userDefaults objectForKey:USERDEFAULTS_UNIONID]
callback:^(NSArray *activities){
if(activities && [activities count] != 0){
NSLog(@"%hhd",[NSThread isMainThread]); //1
NSLog(@"%i", [activities count]); //16
self.activities = activities;
// If your metod doesn't run on main thread call it on main tread:
dispatch_async(dispatch_get_main_queue(), ^{
[tableView reloadData];
});
//Otherwise call just [tableView reloadData];
}else{
NSLog(@"What the ...."); //Doesn't get printed
}
}];
}