1

セルを削除できるテーブル ビューを備えたビュー コントローラーがあります。ブックマークと呼ばれるものを処理する別のクラスがあり、そのクラスはBookmarkHandler. ブックマークをアップロードしたり、ブックマーク配列全体を取得したり、ブックマークを削除したりできるメソッドがあります。ここでは、次のようなクラスがあります。

+ (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];
}
}

したがって、セルを削除するときは、 をBookmarkHandler呼び出してブックマークを削除deleteBookmark:し、テーブル ビューから行を削除します。ただし、この行でクラッシュすることがあります。

        [bookmarkCollection removeObjectAtIndex: indexPath.row];

しかし、クラッシュ ログはなく、All Exceptions ブレークポイントを追加しました。

私が間違っていることはありますか?手伝ってくれてありがとう...

4

2 に答える 2

4

問題はここにあります:

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

NSUserDefaults は可変配列を保存せず、単に NSArray として保存します。
したがって、その変更可能なコピーを取得します。

NSMutableArray *bookmarkCollection = [[[NSUserDefaults standardUserDefaults] objectForKey: @"bookmarks"] mutableCopy];
于 2012-09-27T01:29:52.137 に答える
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);
}
于 2012-09-27T01:09:14.727 に答える