两天来我一直在为这个问题挠头,我真的不知道为什么会发生这种行为......这真的让我感到恶心!
我有一个 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 控制器使用相同的单元格并以相同的方式连接到同一个控制器,却表现得完全不同呢?
我知道这是很多信息,请提出您的问题,我会尽快回答。
谢谢!