我已经在这个问题上摸不着头两天了,我真的找不到为什么会发生这样的行为......这真的让我生病了!
我有一个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控制器使用相同的单元并以相同的方式连接到同一个控制器呢?
我知道这是很多信息,问你的问题,我会尽快回答。
谢谢!