1

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

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

它被嵌入到 aUIView中(UITableViewDelegateUITableViewDataSource设置在 中UITableViewController.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

4 回答 4

3

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

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

确保您将获得一个单元格,因此无需:

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

只要标识符在情节提要中正确设置。

我可能是错的,但我需要知道数据填充发生在哪里。

于 2012-12-25T22:21:02.777 回答
2

看起来您缺少 [self.tableView reloadData]。

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

registerClass:forCellReuseIdentifier:

当你设置你的 UITableView 时。这将确保

dequeueReusableCellWithIdentifier 

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

于 2012-12-25T22:29:23.940 回答
2

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

从...开始:

UITableView *tableData;

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

于 2012-12-26T02:45:15.047 回答
2

如果您将 tableview 添加到 UIViewController,您希望添加 UITableView 而不是 UITableViewController。

于 2012-12-25T23:25:38.187 回答