2011-10-12 112 views
0

我知道这将成为那些令人头疼的时刻之一。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]; 

    } 
} 
+0

请发布您的代码didSelectRowAtIndexPath,删除委托方法和cellForRowAtIndexPath。 –

+0

感谢您的帮助,@ XcodeDev。我更新了原始帖子。 – voodoobilly

+0

每当tableView要求一个新的单元时,你正在对你的'bandList'进行排序。 'cellForRowAtIndexPath'不是准备数据的最佳位置。另外,如果'bandList'随时间变化,你的tableView将会变得不一致。 – kelin

回答

0

这些线在我跳出:

NSDictionary *selectedBand = [bandList objectAtIndex:indexPath.row]; 
NSString *selectedBandId = [selectedBand objectForKey:@"id"]; 

我不明白你的推理从数组取一个值,死守它变成一本字典,然后从字典中取出一个字符串。如果从

[bandList objectAtIndex:indexPath.row];

没有返回值是一样的,你在selectedBandId?

而且得到了什么,我不能分析它的任何进一步的时候,我不知道什么是“deleteMyBand”和“getSavedBands”呢。尝试评论这些调用并查看可见行本身是否可以删除。这可能会告诉你问题在哪里。

+0

bandList是一个字典数组。我必须得到字典,这样我才能从中得到bandId。所有'删除'和'获取'都是从plist删除/读取一个字典数组。我很欣赏你的输入,但我真的只是想弄清楚为什么点击单元格/滑动单元格/点击删除工作,但滑动单元格/点击删除不会触发didSelectRowAtPath。这似乎更像是一个UITableView委托问题,尽管我自己无法弄清楚这个问题,所以我知道什么。 – voodoobilly

+0

我猜测它与调用'deleteMyBand'或'getSavedBands'中当前选定的表格行有关。不知道为什么这两个NSDictionary和NSString线困扰着我;现在看起来很明显。 –

0

不完全确定为什么,但是我为源数据使用排序的NSMutableArray的事实似乎是问题所在。当我从表中删除行并更新MutableArray时,我得到了崩溃。但是,如果我将源数据创建为NSArray,则将数组的mutableCopy创建为临时MutableArray,移除该行,使用该数组,然后将MutableArray写回NSArray,一切都很好。

我不认为这个解释有意义,但它是我看到的模式。如果有人能想到为什么这可能会起作用,请赐教。我的直觉告诉我这是种类,但最近我的直觉并不是很正确。