0


0

行を削除すると、アプリが終了します。コンソール出力なし

ランダムなアイテムがたくさん入ったUITableViewControllerがあります。 アイテムを追加したり、そこからアイテムを削除したりできます。 最初のセクションヘッダーにUITextFieldがあるため、単語/フレーズを入力してリストに追加できます。

問題なくリストから単語を削除できますが、リストに単語を追加してから削除しようとすると、アプリは終了してホーム画面に戻ります。コンソールには何も表示されません。

問題がどこにあるのか分かりません。 私が使用しているaddNewWordメソッドは次のとおりです。

- (void)addNewWord
{
    NSString *newWord = [textField text];
    [array insertObject:newWord atIndex:0];
    NSLog(@"%d", [array count]);
    [textField setText:@""];

    [[self tableView] reloadData];

}

そして、これは-(void)tableView:commitEditingStyle:forRowAtIndexPathメソッドです

- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [array removeObjectAtIndex:[indexPath row]];
        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationRight];
        [tableView endUpdates];
    }
    NSLog(@"%d", [array count]);
}

問題がどこにあるかについて私が考え出したのはそれだけです。これも私が立ち往生している理由です。

どんな洞察力も大歓迎です。 どうもありがとうございました!

-編集:[tableView beginUpdates]を追加しました。および[tableView endUpdates];同じ結果。 他のアイデア?

-Edit2:[tableView beginUpdates]を追加したとき。 [tableView endUpdates] ;、例外が発生します。 コンソール出力は次のとおりです。

2010-09-30 05:56:40.172 DictionaryWordsTest[2350:207] *** Assertion failure in
-[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/
UIKit-1262.60.3/UITableView.m:920
2010-09-30 05:56:40.175 DictionaryWordsTest[2350:207] *** Terminating app
due to uncaught exception 'NSInternalInconsistencyException', reason:
'Invalid update: invalid number of rows in section 0.  The number of rows
contained in an existing section after the update (17) must be equal to the
number of rows contained in that section before the update (17),
plus or minus the number of rows inserted or deleted from that section
(0 inserted, 1 deleted).'
*** Call stack at first throw:
(
0   CoreFoundation                      0x02486b99 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x025d640e objc_exception_throw + 47
2   CoreFoundation                      0x0243f238 +[NSException raise:format:arguments:] + 136
3   Foundation                          0x000b2e37 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4   UIKit                               0x00332d37 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 8719
5   UIKit                               0x00322a01 -[UITableView endUpdates] + 42
6   DictionaryWordsTest                 0x00002a73 -[DictionaryViewController tableView:commitEditingStyle:forRowAtIndexPath:] + 140
7   UIKit                               0x0031f96d -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] + 101
8   UIKit                               0x002b87f8 -[UIApplication sendAction:to:from:forEvent:] + 119
9   UIKit                               0x00343de0 -[UIControl sendAction:to:forEvent:] + 67
10  UIKit                               0x00346262 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
11  UIKit                               0x00344e0f -[UIControl touchesEnded:withEvent:] + 458
12  UIKit                               0x002dc3d0 -[UIWindow _sendTouchesForEvent:] + 567
13  UIKit                               0x002bdcb4 -[UIApplication sendEvent:] + 447
14  UIKit                               0x002c29bf _UIApplicationHandleEvent + 7672
15  GraphicsServices                    0x02d66822 PurpleEventCallback + 1550
16  CoreFoundation                      0x02467ff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
17  CoreFoundation                      0x023c8807 __CFRunLoopDoSource1 + 215
18  CoreFoundation                      0x023c5a93 __CFRunLoopRun + 979
19  CoreFoundation                      0x023c5350 CFRunLoopRunSpecific + 208
20  CoreFoundation                      0x023c5271 CFRunLoopRunInMode + 97
21  GraphicsServices                    0x02d6500c GSEventRunModal + 217
22  GraphicsServices                    0x02d650d1 GSEventRun + 115
23  UIKit                               0x002c6af2 UIApplicationMain + 1160
24  DictionaryWordsTest                 0x00001f58 main + 102
25  DictionaryWordsTest                 0x00001ee9 start + 53
)
terminate called after throwing an instance of 'NSException'

2 Answer


1


-[tableView deleteRowsAtIndexPaths]呼び出しをラップする必要があります [tableView beginUpdates] and [tableView endUpdates].


0


奇妙なことに、答えは最終的に私が期待していたもの以外のものになりました。 違いが何なのか、なぜコンソール出力が得られなかったのかはわかりませんが、私がやったことはここにあります。

addNewWordでは、reloadDataを使用する代わりに、これらのメソッドを使用してtableViewをリロードし、上部に単語を挿入しました(したがって、新しい単語を表示するためにビューの下部にスクロールする必要はありませんでした)。

- (void)addNewWord
{
[[self tableView] beginUpdates];
NSString *newWord = [textField text];

[array insertObject:newWord atIndex:0];
[textField setText:@""];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[[self tableView] endUpdates];
}

次に、キーは、addNewWordが次から呼び出されないことだと思います:

[textField addTarget:self action:@selector(addNewWord) forControlEvents:UIControlEventEditingDidEndOnExit];

しかし、テキストフィールドの隣にそれを呼び出すボタンを追加しました。 すべてうまくいった。