3

两天来我一直在为这个问题挠头,我真的不知道为什么会发生这种行为......这真的让我感到恶心!

我有一个 iOS 应用程序,它使用由界面生成器构建的故事板。打开视图是拥有 2 个选项卡的 TabBarVC:

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

选项卡 2:集合视图控制器 -> 导航控制器 -> TableView Controller3 -> TableView Controller2(是的,我的意思是这样写)

在 TableView 控制器 1 和 3 中的每一个中,我都使用了动态原型单元格(样式 = 正确的细节,附件 = 披露指示器)。在第一个中,我设置了一个重用标识符,比如说 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;
}

...并且我使用以下代码来 segue 到 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 的单元格出列 - 必须为标识符注册一个 nib 或类或连接情节提要中的原型单元格”

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

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

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

此外,即使代码与 TableView Controller1 的实现中的代码相同,选择单元格也不会触发应有的 segue:

- (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 控制器使用相同的单元格并以相同的方式连接到同一个控制器,却表现得完全不同呢?

我知道这是很多信息,请提出您的问题,我会尽快回答。

谢谢!

4

0 回答 0