2012-09-27 108 views
1

我有一個視圖控制器與表視圖,您可以刪除單元格。我有另一個處理稱爲書籤的類,這個類被稱爲BookmarkHandler。有一些方法可以上傳書籤,獲取整個書籤數組並刪除書籤。下面是類如下:Objective-C NSMutableArray removeObjectAtIndex:崩潰

+ (NSMutableArray *)bookmarkCollection { 

NSMutableArray *bookmarkCollection = [[NSUserDefaults standardUserDefaults] objectForKey: @"bookmarks"]; 

if (!bookmarkCollection) { 

    bookmarkCollection = [[NSMutableArray alloc] init]; 
} 

return bookmarkCollection; 
} 

+ (void)deleteBookmark: (NSIndexPath *)indexPath { 

    NSMutableArray *bookmarkCollection = [[NSUserDefaults standardUserDefaults] objectForKey: @"bookmarks"]; 

    [bookmarkCollection removeObjectAtIndex: indexPath.row]; 

    [[NSUserDefaults standardUserDefaults] setObject:bookmarkCollection forKey: @"bookmarks"]; 

    [[NSUserDefaults standardUserDefaults] synchronize]; 

} 
+ (void)uploadBookmark:(NSDictionary *)singleBookmark { 

    NSMutableArray *bookmarkCollection = [[NSUserDefaults standardUserDefaults] objectForKey: @"bookmarks"]; 


if (!bookmarkCollection) { 

    bookmarkCollection = [[NSMutableArray alloc] init]; 
} 

NSMutableDictionary *bookmark1 = [[NSMutableDictionary alloc] initWithDictionary: singleBookmark]; 

NSMutableDictionary *bookmark2 = [[NSMutableDictionary alloc] initWithDictionary: singleBookmark]; 


NSNumber *number1 = [[NSNumber alloc] initWithInt: 1]; 
NSNumber *number2 = [[NSNumber alloc] initWithInt: 2]; 

[bookmark1 setObject:number1 forKey: @"bookmarkTag"]; 
[bookmark2 setObject:number2 forKey: @"bookmarkTag"]; 

[bookmarkCollection addObject: bookmark1]; 
[bookmarkCollection addObject: bookmark2]; 

[[NSUserDefaults standardUserDefaults] setObject:bookmarkCollection forKey: @"bookmarks"]; 

[[NSUserDefaults standardUserDefaults] synchronize]; 

} 

的書籤集合,其是一個可變陣列,由具有名稱和日期的對象/鍵字典填充。這些名稱和日期是填充其他視圖控制器中表格視圖單元格標題的名稱和日期。細胞的表視圖的數量由[[BookmarkHandler bookmarkCollection] count];

確定在可以刪除表格視圖單元的其他視圖控制器,所以我做的是我實現的委託方法:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 


if (editingStyle == UITableViewCellEditingStyleDelete) { 

    [BookmarkHandler deleteBookmark: indexPath]; 

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject: indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
} 
} 

所以,當我刪除單元格時,我通過調用deleteBookmark:BookmarkHandler中刪除書籤,並從表格視圖中刪除該行。但有時這條線上有崩潰:

 [bookmarkCollection removeObjectAtIndex: indexPath.row]; 

但沒有崩潰日誌,並且我添加了一個所有異常斷點。

有什麼我做錯了嗎?感謝您的幫助...

+0

什麼調試器告訴你,當你踩過去斷點? – geraldWilliam

+0

@geraldWilliam什麼都沒有!真的很奇怪...... – MCKapur

+1

請注意,Xcode 4/iOS 5中存在一個錯誤,因爲它在所有情況下都無法可靠地產生異常追溯。看到[這個線程](http://stackoverflow.com/questions/8100054/no-exception-stack-trace-in-console-under-xcode-4-2-ios-5)。 –

回答

4

的問題是在這裏:

NSMutableArray *bookmarkCollection = [[NSUserDefaults standardUserDefaults] objectForKey: @"bookmarks"]; 

NSUserDefaults的不保存一個可變的陣列,它只是將其保存爲NSArray的。
所以利用它的可變副本:

NSMutableArray *bookmarkCollection = [[[NSUserDefaults standardUserDefaults] objectForKey: @"bookmarks"] mutableCopy]; 
+0

謝謝我將盡快測試它 – MCKapur

+0

謝謝!有效! – MCKapur

1

您應該檢查indexPath.row以確保它不超出邊界。在這之後,你可以找到原因。

if (indexPath.row>=0 && indexPath.row<bookmarkCollection.count) { 
    [bookmarkCollection removeObjectAtIndex: indexPath.row]; 
} else { 
    NSLog(@"indexPath.row is out of boundry of bookmarkCellection size: %d", bookmarkCollection.count); 
} 
+0

我把那個if語句,只有現在我得到這個崩潰日誌: – MCKapur

+0

2012-09-27 09:10:25.829 MileIndex [35555 :1d903] ***終止應用程序由於未捕獲的異常'NSInternalInconsistencyException',原因:' - [__ NSCFArray removeObjectAtIndex:]:變異方法發送到不可變對象' – MCKapur

+0

它說,我removeObjectAtIndex:從NSArray,但它是一個可變array ...讓我檢查我的代碼,如果我不小心將bookmarkCollection設置爲非可變的nsarray對象 – MCKapur

相關問題