UITableView didSelectRowAtIndexPath有时只会被触发

时间:2011-10-12 00:09:28

标签: iphone objective-c ios ios4

我知道这将成为那些令人头疼的时刻之一。

我有一个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];

    }
}

2 个答案:

答案 0 :(得分:0)

这些线条向我跳出来:

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

我不明白你从数组中获取值,将其粘贴到字典中,然后从该字典中获取字符串的理由。不应该从

返回的值

[bandList objectAtIndex:indexPath.row];

selectedBandId?

中的内容相同

另外,当我不知道“deleteMyBand”和“getSavedBands”做什么时,我无法进一步分析它。尝试注释掉这些调用,看看是否可以删除可见行本身。这可能会告诉你问题出在哪里。

答案 1 :(得分:0)

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

我不认为这种解释是有道理的,但这是我所看到的模式。如果有人能想到为什么这可能有效,请赐教。我的直觉告诉我这是那种,但我的直觉最近并不正确。