iOS TableViewController不显示

时间:2013-11-20 14:51:48

标签: ios objective-c

我已经制作了一个带有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正确设置了数据源。此外,数据来自另一个线程,但在主线程上返回它也可能不是问题。

4 个答案:

答案 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
                            }
                        }];
    }