3

新しい UITableViewCell を挿入しようとしているときに私が間違っていることを誰かが説明できますか? カスタム UITableViewCell を挿入しようとしていますが、次のエラーがスローされます: '無効な更新: セクション 0 の行数が無効です。更新後の既存のセクションに含まれる行数 (1) は、次の数と等しくなければなりません更新前にそのセクションに含まれていた行数 (1)、そのセクションから挿入または削除された行数 (1 挿入、0 削除) のプラスまたはマイナス、およびそのセクションに移動された、またはセクションから移動された行数 (0) のプラスまたはマイナス転入、0 転出)」。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
if (section == 0)
    return 1;
else if (section == 1)
    return numberOfRows;
return 1;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"EditableCell";

EditableCell *editableCell = (EditableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (editableCell == nil) {

    editableCell = [[EditableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

_myTextField = [editableCell textFieldCell];

if (indexPath.section == 0){
    [_myTextField setPlaceholder:@"Menu Name"];
    [_myTextField setReturnKeyType:UIReturnKeyNext];
}
else if (indexPath.section == 1){
    [_myTextField setPlaceholder:@"Category"];
    [_myTextField setReturnKeyType:UIReturnKeyNext];
}
else {
    [_myTextField setPlaceholder:@"Category"];
    [_myTextField setReturnKeyType:UIReturnKeyDone];
}

_myTextField.keyboardType = UIKeyboardTypeDefault;
_myTextField.delegate = self;

return editableCell;
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField{

if (textField.returnKeyType == UIReturnKeyNext) {

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
    NSArray *array = [[NSArray alloc] initWithObjects:indexPath, nil];

    [self.tableView insertRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationTop];

    numberOfRows = numberOfRows + 1;

    [self.tableView reloadData];
    }     
}
4

2 に答える 2

7

以下のメソッドで返される行数が正しい行数を返すことを確認する必要があります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

何が起こっているのかは、挿入後にここで同じ値を返していることだと確信していますが、ランタイムは、行を挿入するための呼び出しを行う前よりも 1 つ多いと予想しています。

もう少し詳しく説明すると、MVC 用語 (モデル/ビュー/コントローラー) で何が起こっているかは次のとおりです。

  1. への呼び出しinsertRowsAtIndexPathsは、コントローラーが追加の行でビューを更新することを要求しています。
  2. 次に、コントローラはサニティ チェックを実行して、合計が正しいかどうかを確認するため、次のように呼び出します。 tableView:numberOfRowsInSection

    これで、コントローラーは、このメソッドが最後に返した値 (この場合は 1) を認識し、行の挿入を要求したことも認識します。削除呼び出しがなかったので、次にこのメソッドを呼び出したとき、値は (前回の値 + 挿入された行 - 削除された行) = 2 になるはずです。

  3. コントローラーは、順序が整っていると判断した場合、(他のメソッドと共に) を呼び出しcellForRowAtIndexPathて、各セクションの各行の実際のセルを取得します。

したがって、問題については、モデル内の行を追跡する必要があります-おそらく、使用可能な行数を含む配列または ivar で。を呼び出す前に行を追加/削除するときにこの値を更新してモデルを更新し、 が呼び出されinsertRowsAtIndexPathたときにこの値を返しますtableView:numberOfRowsInSection

追加のヒント:

セルの挿入/削除をアニメーション化する場合は、コードを次のように変更します。への呼び出しがなくなったことに注意してくださいreloadData。代わりに、挿入/リロードが開始/終了の更新呼び出しにラップされます。呼び出しにより、アニメーション化された更新が発生しendUpdatesますreloadSections

NSMutableIndexSet *sectionsToReload = [[NSMutableIndexSet alloc] init];
[sectionsToReload addIndex:1]; // Add sections as necessary

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationTop];
[self.tableView reloadSections:sectionsToReload withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];

Apple の WWDC 2010 ビデオ「Mastering Table Views」をチェックしてくださいinsertRowsAtIndexPaths

HTH、ストレッチ

于 2012-06-21T00:31:53.903 に答える
0

新しいセルを挿入しようとした後、データソースには、元のセルの数 (1) と、挿入する「余分な」セル (1) の合計が 2 つ含まれている必要があります。したがって、tableView:numberOfRowsInSection:2 を返す必要があります。

エラーメッセージは、tableView:numberOfRowsInSection:が 1 を返したことを示していました。

この「余分な」セルを返すようにデータソースを更新します。

于 2012-06-21T00:29:42.133 に答える