UITableView didSelectRowAtIndexPath有时只会被解雇
我知道这将成为那些令人头疼的时刻之一。UITableView didSelectRowAtIndexPath有时只会被解雇
我有一个UITableView,我需要从中删除单元格。问题是,didSelectRowAtIndexPath仅在我第一次点击该行然后滑动以显示删除按钮时被调用。如果我在没有明确点击该行的情况下刷动该行,则会出现EXC_BAD_ACCESS错误。我把一个NSLog放入didSelectRowAtIndexPath中,当我点击单元格时可以看到indexPath数组,但是如果我只是轻轻滑动而没有点击就可以看到。
我已经完成了我的搜索分享,并且我99%确定我的委托已正确连接(通常是问题#1)并且没有键入didDeselectRowAtIndexPath(通常是问题#2)。我也有我的.h文件(问题#3)。
在此先感谢。
编辑:
我应该说:如果我刷卡行没有明确点击行,然后我得到的时候我点击删除按钮的EXC_BAD_ACCESS错误。如果点击单元格然后刷卡,我可以点击删除,并按预期方式删除。
编辑:
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[bandList sortUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]];
NSDictionary *dict = [bandList objectAtIndex:indexPath.row];
cell.textLabel.text = [dict objectForKey:@"name"];
return cell;
}
- (void)tableView: (UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath
{
NSLog(@"IndexPath: %@", [indexPath description]);
}
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete)
{
NSDictionary *selectedBand = [bandList objectAtIndex:indexPath.row];
NSString *selectedBandId = [selectedBand objectForKey:@"id"];
[self deleteMyBand:selectedBandId];
bandList = [self getSavedBands];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
这些线在我跳出:
NSDictionary *selectedBand = [bandList objectAtIndex:indexPath.row]; NSString *selectedBandId = [selectedBand objectForKey:@"id"];
我不明白你的推理从数组取一个值,死守它变成一本字典,然后从字典中取出一个字符串。如果从
[bandList objectAtIndex:indexPath.row];
没有返回值是一样的,你在selectedBandId?
而且得到了什么,我不能分析它的任何进一步的时候,我不知道什么是“deleteMyBand”和“getSavedBands”呢。尝试评论这些调用并查看可见行本身是否可以删除。这可能会告诉你问题在哪里。
bandList是一个字典数组。我必须得到字典,这样我才能从中得到bandId。所有'删除'和'获取'都是从plist删除/读取一个字典数组。我很欣赏你的输入,但我真的只是想弄清楚为什么点击单元格/滑动单元格/点击删除工作,但滑动单元格/点击删除不会触发didSelectRowAtPath。这似乎更像是一个UITableView委托问题,尽管我自己无法弄清楚这个问题,所以我知道什么。 – voodoobilly
我猜测它与调用'deleteMyBand'或'getSavedBands'中当前选定的表格行有关。不知道为什么这两个NSDictionary和NSString线困扰着我;现在看起来很明显。 –
不完全确定为什么,但是我为源数据使用排序的NSMutableArray的事实似乎是问题所在。当我从表中删除行并更新MutableArray时,我得到了崩溃。但是,如果我将源数据创建为NSArray,则将数组的mutableCopy创建为临时MutableArray,移除该行,使用该数组,然后将MutableArray写回NSArray,一切都很好。
我不认为这个解释有意义,但它是我看到的模式。如果有人能想到为什么这可能会起作用,请赐教。我的直觉告诉我这是种类,但最近我的直觉并不是很正确。
请发布您的代码didSelectRowAtIndexPath,删除委托方法和cellForRowAtIndexPath。 –
感谢您的帮助,@ XcodeDev。我更新了原始帖子。 – voodoobilly
每当tableView要求一个新的单元时,你正在对你的'bandList'进行排序。 'cellForRowAtIndexPath'不是准备数据的最佳位置。另外,如果'bandList'随时间变化,你的tableView将会变得不一致。 – kelin