9

私はdetailViewControllerとMasterViewControllerを持っています。MasterViewController は、UITableView がある場所です。テーブルには 2 つのセクションがあります。上部のセクションはアイテムのリスト用で、下部のセクションには @"Add new row" という 1 つのエントリがあります。

@「新しい行を追加」は、UITextField を編集できる detailViewController に移動します。次に、保存が押されると、次のようにします。

- (IBAction)saveButtonPressed:(id)sender {
    if ([detailControllerDelegate respondsToSelector:@selector(setNewmap:)]) {
        if (self.textField.text.length > 0) {
            [self.textField endEditing:YES];
            [detailControllerDelegate setValue:self.textField.text forKey:@"newmap"];
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}

次に、MasterViewController で、

- (void)setNewmap:(NSString *)newmap {
    if (![newmap isEqualToString:_newmap]) {
        _newmap = newmap;

        [self.maps addObject:_newmap];

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.maps count] inSection:MAPS_SECTION];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

reloadRowsAtIndexPaths でクラッシュし、次のメッセージが表示されます。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 3 from section 0 which only contains 2 rows before the update'

なぜこれが呼び出されるのかわかりません。tableViewUpdates を実行すると、モデルが更新されると思いましたself.maps addObject:newmap];。カウントをログに記録しましたが、カウントは正しいです。モデルを更新した後、行を自由にリロードできると思いました。

特定の行をリロードせず、tableView で reloadData を呼び出すと、クラッシュしません。ここで何が違うのかわからない。self.maps モデルを更新しても、numberOfRowsInSection デリゲート メソッドが更新されないようです。

4

4 に答える 4

34

この質問が出されてからしばらく経っていることは知っていますが、問題は、 reloadRowsAtIndexPaths がテーブル内のこれらの行の以前の存在に依存し、内部でそれらを削除、再作成、および挿入することである可能性があると思います (ボンネットの下で)。そのため、これらの行がまだテーブルにない状態で特定のリロードを呼び出すと、そこにない行を削除しようとしています。

コレクションビューで同じ問題に遭遇しました。フル リロードが機能する理由は、すべてを更新し、以前の状態に依存せず、データ ソースの現在の状態のみに依存するためです。

これが問題に対する私の見解です。

于 2013-01-15T18:01:52.717 に答える
1
    - (NSInteger)tableView:(UITableView *)tableView 
     numberOfRowsInSection:(NSInteger)section{}

このメソッドでは、整数を動的に返す必要があります。更新する前に、セクションの新しい行数を取得して返す必要があります。

于 2012-06-01T05:14:54.857 に答える
1

これは、存在しない行、または最初から存在していなかった行を再ロードした場合に発生する可能性があります。

于 2015-07-15T13:10:16.983 に答える
0

配列またはディクショナリ (この場合は self.maps) のカウントは、配列のインデックスがゼロであるため、常に最後の項目より 1 つ大きくなります。

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.maps count]-1 inSection:MAPS_SECTION];

于 2012-06-01T05:38:03.820 に答える