麻烦填充UITableView

时间:2012-12-25 21:40:21

标签: iphone objective-c ios uitableview

我在填充子类UITableView时遇到问题。

我得到的只是一个空白屏幕。

它已嵌入到UIView中,UITableViewDelegate中设置了UITableViewDataSourceUITableViewController.h

    TableViewController *tableView = [[TableViewController alloc] 
                                     initWithStyle:UITableViewStyleGrouped];
    tableView.view.frame = CGRectMake(0.0, 50.0, 320.0, 
                           self.view.bounds.size.height);
    tableView.tableView.dataSource = tableView;
    tableView.tableView.delegate = tableView;
    [self.view addSubview:tableView.view];

然后,在UITableViewController中,我创建了一个虚拟数组,用作数据源:

library = [[NSArray alloc] initWithObjects:
                    @"Dummy 1",
                    @"Dummy 2",
                    @"Dummy 3",
                    @"Dummy 4", nil];

然后我按原样执行所需的数据源委托方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView 
                       numberOfRowsInSection:(NSInteger)section
{
    int rows;
    if (section == 0) {
        rows = [library count];
    }
    else if (section == 1) {
        rows = 0;
    }
    return rows;
 }

- (NSString *)tableView:(UITableView *)tableView 
                        titleForHeaderInSection:(NSInteger)section {
    if(section == 0) {
        return [NSString stringWithFormat:@"Missions Library"];
    }
    else {
         return [NSString stringWithFormat:@"Acknowledgements"];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView 
                                   cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellId = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId 
                                       forIndexPath:indexPath];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                        reuseIdentifier:CellId];
    }

    cell.textLabel.text = [library objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

我已经阅读了大量的表格视图教程,我无法弄清楚问题。我没有收到任何错误消息,只是一个空白的表格视图屏幕。

我做错了什么?

一些更新:

  1. 如果我不将tableView的视图添加为子视图但直接调用它,我会显示页眉和页脚,但不显示单元格。

  2. 根本没有调用cellForRowAtIndexPath方法(我用NSLog检查了它)。这就解释了为什么我没有得到细胞。

  3. 整个练习是拥有一个仅占据屏幕下方的分组表格视图。但我的方法可能不是实现这一目标的最佳方法......

4 个答案:

答案 0 :(得分:3)

我认为这里的问题是你的库数组正在加载对象,但是UITableView实例本身没有得到通知(通过reloadData)。另外,请记住调用

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId 
                                    forIndexPath:indexPath];

确保您获得一个单元格,因此不需要:

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                     reuseIdentifier:CellId];
}

只要在故事板中正确设置了标识符。

我可能错了,但我需要知道数据填充的位置。

答案 1 :(得分:2)

看起来你错过了[self.tableView reloadData]。

此外,如果您支持ios 6.0+,请使用方法

registerClass:forCellReuseIdentifier:

当您设置UITableView时。这将确保

dequeueReusableCellWithIdentifier 

返回一个单元格,而不是nil,因此您不必执行if(cell == nil)检查。

答案 2 :(得分:2)

如果你将一个tableview添加到UIViewController,你想要添加一个UITableView而不是一个UITableViewController。

答案 3 :(得分:2)

您不需要使用TableViewController。只需添加一个UITableView。

开始于:

UITableView *tableData;

然后填写表并将其添加为子视图的方法。