使用故事板的uitableviewcontroller中的动态原型单元

时间:2013-01-10 03:51:45

标签: objective-c uitabbarcontroller storyboard uitableview

我已经在这个问题上摸不着头两天了,我真的找不到为什么会发生这样的行为......这真的让我生病了!

我有一个iOS应用程序,它使用使用界面构建器构建的故事板。开放视图是一个拥有2个标签的TabBarVC:

选项卡1:导航控制器 - > TableView Controller1 - > TableView Controller2

选项卡2:集合视图控制器 - >导航控制器 - > TableView Controller3 - > TableView Controller2(是的,我打算写那个)

在TableView控制器1和3的每一个中,我使用动态原型单元格(style = right detail,accessory = disclosure indicator)。在第一个中,我设置了一个重用标识符,比如TableView1Cell。在我的tableview实现中,我使用以下代码返回一个单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"TableView1Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    SFBottles *bottleAtIndex = [self.dataController getCellarBottleAtIndex:indexPath.row];
    [cell.textLabel setText:bottleAtIndex.houseName];
    [cell.detailTextLabel setText:bottleAtIndex.productName];

    return cell;
}

...我使用以下代码转换为TableView Controller2:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"ShowBottleDetails"])
    {
        CellarDetailViewController *detailVC = [segue destinationViewController];
        detailVC.bottle = [self.dataController getCellarBottleAtIndex:[self.tableView indexPathForSelectedRow].row];
    }
}

以上所有工作都符合预期。我在TableView Controller3中执行完全相同的操作:

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

    SFBottles *bottleAtIndex = [self.bottlesArray objectAtIndex:indexPath.row];
    [cell.textLabel setText:bottleAtIndex.houseName];
    [cell.detailTextLabel setText:bottleAtIndex.productName];

    return cell;
}

...当这个视图控制器在运行时加载时,我收到以下错误:

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'无法将单元格出列   标识符TableView3Cell - 必须注册一个笔尖或类   标识符或连接故事板'

中的原型单元格

然而,我可以通过将此行添加到TableView Controller3的viewDidLoad来清除此错误:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"TableView3Cell"];

但是当我这样做时,右侧的字幕或披露指示都不会出现在显示的单元格上。

此外,选择一个单元格不会像它应该的那样触发segue,即使代码与TableView Controller1的实现中的相同:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"OverviewListToBottleDetails"])
    {
        CellarDetailViewController *detailVC = [segue destinationViewController];
        detailVC.bottle = [self.bottlesArray objectAtIndex:[self.tableView indexPathForSelectedRow].row];
        detailVC.navigationItem.rightBarButtonItem = nil;
    }
}

那么,为什么2个外观相似的TableView控制器使用相同的单元并以相同的方式连接到同一个控制器呢?

我知道这是很多信息,问你的问题,我会尽快回答。

谢谢!

0 个答案:

没有答案