2011-10-12 109 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,一切都很好。

我不認爲這個解釋有意義,但它是我看到的模式。如果有人能想到爲什麼這可能會起作用,請賜教。我的直覺告訴我這是種類,但最近我的直覺並不是很正確。