Ios 在同一.Xib文件中为多个UITableViewCell注册nib

Ios 在同一.Xib文件中为多个UITableViewCell注册nib,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我创建了一个.xib文件,其中包含2个以上的tableview单元格。我在viewDidLoad()方法中使用了以下代码来注册nib以重用单元格 UINib *nib = [UINib nibWithNibName:@"CartTableViewCells" bundle:nil]; [self.tableView registerNib:nib forCellReuseIdentifier:@"Cell0"]; [self.tableView registerNib:nib forCellRe

我创建了一个.xib文件,其中包含2个以上的tableview单元格。我在
viewDidLoad()
方法中使用了以下代码来注册nib以重用单元格

UINib *nib = [UINib nibWithNibName:@"CartTableViewCells" bundle:nil];
[self.tableView registerNib:nib forCellReuseIdentifier:@"Cell0"];
[self.tableView registerNib:nib forCellReuseIdentifier:@"Cell1"];
[self.tableView registerNib:nib forCellReuseIdentifier:@"Cell2"];
在-[UITableView CellForRowatineXpath]方法中,我使用了以下代码

cell0 = (CartTableViewCells *)[self.tableView dequeueReusableCellWithIdentifier:@"Cell0"];
if (cell0==nil)
{
    cell0 = [[[NSBundle mainBundle] loadNibNamed:@"CartTableViewCells" owner:self options:nil] objectAtIndex:0];
}
但我的应用程序因以下错误而崩溃:

***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“为标识符(Cell0)注册的nib无效-nib必须仅包含一个顶级对象,该对象必须是UITableViewCell实例”


您可以这样做,只要您有某种方式来区分XIB中的视图(标记、自定义类等)。您甚至不需要注册nib–您所要做的就是:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger cellIndex = 12345;
    NSString *cellIdentifier = @"MyAwesomeCell";

    // dequeue cell or, if it doesn't exist yet, create a new one from the nib
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyNibWithLotsOfCustomCells" owner:self options:nil];
        NSUInteger index = [topLevelObjects indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
            // if you distinguish the views by class
            return [obj isMemberOfClass:NSClassFromString(cellIdentifier)];
            // if you distinguish the views by tag
            return [(UIView*)obj tag] == cellIndex;
        }];
        cell = topLevelObjects[index];
    }

    // etc.
}

重要的是使用
dequeueReusableCellWithIdentifier:
而不是
dequeuereusablevelWithIdentifier:forIndexPath:
(区别在中解释)。

如果您对所有行使用相同的nib,只需注册一次。您是否正在使用cell tableview模板创建nib?我认为单元格的结构是错误的。两个有类似问题的链接我使用的是同一个nib,但nib文件有3个tableviewcells,其中有3个不同的重用标识符,并将3个单元格用于不同的行。您有一个包含3个单元格的nib吗?我通常有1个笔尖和一个单元格。可能使用
[[NSBundle mainBundle]loadNibNamed:owner:options:][/code>这会返回一个数组,我不知道是否每个单元格都位于数组的不同位置。类似这样的内容:
NSArray*nibs=[[NSBundle mainBundle]loadNibNamed:@“mynib”所有者:自选项:nil];UINib*nib=[nibs objectAtIndex:0][self.tableView注册表项nib:nib forCellReuseIdentifier:@“Cell0”]必须对阵列上的其余NIB执行相同的操作