Ios 如何正确使用;dequeueReusableCellWithIdentifier:“;有多个标识符?

Ios 如何正确使用;dequeueReusableCellWithIdentifier:“;有多个标识符?,ios,core-data,uitableview,Ios,Core Data,Uitableview,我有一个以核心数据为基础的表视图,其中显示了可编辑字段的列表,对于不同的字段类型,我有不同的UTableViewCells和不同的单元格标识符。当我在模拟器中滚动过快或试图“反弹”过最后一个单元格时,我会遇到崩溃,说UITableView数据源必须从tableView:cellforrowatinedexpath返回一个单元格。如果我删除dequeueReusableCellWithIdentifier:steps,整个问题就会消失。这意味着我的表视图效率较低。在我的表视图中,我最多使用20个获

我有一个以核心数据为基础的表视图,其中显示了可编辑字段的列表,对于不同的字段类型,我有不同的UTableViewCells和不同的单元格标识符。当我在模拟器中滚动过快或试图“反弹”过最后一个单元格时,我会遇到崩溃,说UITableView数据源必须从tableView:cellforrowatinedexpath返回一个单元格。如果我删除dequeueReusableCellWithIdentifier:steps,整个问题就会消失。这意味着我的表视图效率较低。在我的表视图中,我最多使用20个获取的对象(更多的是8-10),因此效率低下可能是一个小问题。我只是想知道我是不是做错事了

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    Field *aField = [self.fetchedResultsController objectAtIndexPath:indexPath];
    static NSString *CellIdentifier = @"Cell";
    static NSString *ChoiceIdentifier = @"ChoiceCell";
    static NSString *SwitchIdentifier = @"SwitchCell";

    UITableViewCell *cell;

    if ([aField.fieldType isEqualToString:@"choice"] || [aField.fieldType isEqualToString:@"date"]  || [aField.fieldType isEqualToString:@"multiChoice"] ) {

        NSLog(@"ChoiceCell");
        cell = [tableView dequeueReusableCellWithIdentifier:ChoiceIdentifier];
        if (cell == nil) {
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
                [[NSBundle mainBundle] loadNibNamed:@"ChoiceTableViewCell-iPad" owner:self options:nil];
            } else {
                [[NSBundle mainBundle] loadNibNamed:@"ChoiceTableViewCell" owner:self options:nil];
            }
        }

    } else if ([aField.fieldType isEqualToString:@"boolean"]){

        NSLog(@"SwitchCell");
        cell = [tableView dequeueReusableCellWithIdentifier:SwitchIdentifier];
        if (cell == nil) {

            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
                [[NSBundle mainBundle] loadNibNamed:@"SwitchTableViewCell-iPad" owner:self options:nil];
            } else {

                [[NSBundle mainBundle] loadNibNamed:@"SwitchTableViewCell" owner:self options:nil];
            }
        }


    } else {

        NSLog(@"Cell");
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
                [[NSBundle mainBundle] loadNibNamed:@"EditableTableViewCell-iPad" owner:self options:nil];
            } else {

                [[NSBundle mainBundle] loadNibNamed:@"EditableTableViewCell" owner:self options:nil];
            }
        }
    } 

    cell = editableCell;
    self.editableCell = nil;


    // Configure the cell...
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}
其他详细信息:可编辑单元格被设置为与自定义单元格对应的每个NIB中的单元格。我试着更直接地说

dynamicCell = [[[NSBundle mainBundle] loadNibNamed:@"ChoiceTableViewCell-iPad" owner:self options:nil] objectAtIndex:0];
但还是有同样的问题。它永远不会返回零。只要我滚动不太快,所有笔尖都被加载了。我已经仔细检查了笔尖的名称以确定

以下是更新后的工作代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


}问题似乎出在:

cell = editableCell

如果
editableCell
为零,您的应用程序将崩溃。我假设您打算通过
loadNibNamed:
设置
editableCell
。如果将单元格出列,则不会设置此选项。

看起来问题在于:

cell = editableCell

如果
editableCell
为零,您的应用程序将崩溃。我假设您打算通过
loadNibNamed:
设置
editableCell
。如果您将单元格出列,则不会设置它。

我会尝试一下,但如果是这种情况,它如何在第一次尝试加载时不会崩溃?b/c您不会在第一次加载时将单元格出列(即,没有任何东西可以出列,因此所有单元格都是从nib文件创建的)。谢谢,您可以在回复中更详细一点,但它让我到达了我需要的地方。呵呵,是的,我想。我更喜欢“教人钓鱼…”的方法。很高兴你解决了这个问题。我会试一试,但如果是这样的话,它第一次尝试加载时怎么不会崩溃呢?b/c你不是在第一次加载时将单元格出列(也就是说,没有任何东西可以出列,所以所有单元格都是从nib文件创建的)。谢谢,你可以在回复中更详细一点,但它让我到达了我需要的地方。呵呵,是的,我想。我更喜欢“教人钓鱼…”的方法。很高兴您解决了这个问题。您的重用标识符在NIB中设置正确了吗?iPad不应该有特殊的if分支。NSBundle可以自己加载正确的nib。为了简化代码,您还应该只调用一次[bundle loadNib:filename],并使用if分支仅设置变量“NSString*filename”。您的reuseIdentifier在nibs中设置正确吗?iPad不应该有特殊的if分支。NSBundle可以自己加载正确的nib。为了简化代码,还应该只调用一次[bundle loadNib:filename],并使用if分支设置变量“NSString*filename”。