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