2011-11-23 3 views
0

いいえ、私は立ち往生しています。これは私の前の投稿の延長です。ここに私がやろうとしていることがあります。insertRowsAtIndexPathsを使用しているときの表ビューのセルインデックス処理

ナビゲーションバーに[編集]ボタンがあります。このボタンを押すと、1つのセクションテーブルビューの先頭にセルが追加されます。このセルの目的は、新しいデータをテーブルに追加できるようにする場合です。編集スタイルはInsertです。表の残りのセルは、編集スタイル「削除」で構成されます。ここで

は私のsetediting方法である:私は今、2つのインデックスパスを持っている以外、

- (IBAction) setEditing:(BOOL)isEditing animated:(BOOL)isAnimated 
{ 
    [super setEditing:isEditing animated:isAnimated]; 
    // We have to pass this to tableView to put it into editing mode. 
    [self.tableView setEditing:isEditing animated:isAnimated]; 

    // When editing is begun, we are adding and "add..." cell at row 0. 
    // When editing is complete, we need to remove the "add..." cell at row 0. 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    NSArray* path = [NSArray arrayWithObject:indexPath]; 

    // fill paths of insertion rows here 
    [self.tableView beginUpdates]; 
    if(isEditing) 
    [self.tableView insertRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationBottom]; 
    else 
    [self.tableView deleteRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationBottom]; 
    [self.tableView endUpdates]; 

    // We nee to reload the table so that the existing table items will be properly 
    // indexed with the addition/removal of the the "add..." cell 
    [self.tableView reloadData]; 
} 

私は私のコードでは、この余分なセルを占めています= [0,0] - 新しいセルと最初の古い元テーブル内のセル。 setEditingでテーブルビューのセルをリロードするための呼び出しを追加すると、セルのインデックスが再作成されますが、テーブルビューはアニメーション化されなくなりました。

私はケーキを食べて食べたいです。私がやっていることを達成し、アニメーションを維持する別の方法がありますか?

--John

+0

これは、テーブルの最後に新しいセルが追加されていることを除いて、これが行われるサンプルコードを見てきました。私が欲しいものではありません - 私はテーブルの冒頭でそれをしたいです。 – johnnyspo

+0

問題は何か、何を達成しようとしているのかは不明です。 – XJones

+0

アドレス帳を例にとります。連絡先を編集すると、 "アドレス"セクションの最後に "新しいアドレスを追加する"セルが "+"編集スタイルで追加されます。セクションの冒頭に新しいセルが必要な場合を除いて、私は同様のことをしたい。私はindexPath [0,0]にセルを挿入することでこれを簡単に達成できます。しかし、これは[0,0]に2つのセルを与えます(新しいセルと[0,0]の元のセル)。私はこれを修正することができますが、テーブルを再ロードする(セルを再インデクシングする)ことを除いて、編集ボタンが押されたときに表がアニメーション化されなくなりました。 – johnnyspo

答えて

0

あなたがやりたいことができますが、テーブルと一致してデータソースを維持する必要があります。つまり、テーブルが再ロードされると、setEditing:antimated:で追加/削除する編集状態に応じて、tableView:cellForRowAtIndexPathと他のUITableViewDataSourceおよびUITableViewDelegateメソッドが同じセルを返す必要があります。

したがって、setEditing:animated:にセルを挿入/削除する場合、データソースに同じ変更が反映されていることを確認する必要があります。セクションの先頭に特殊なセルを追加しても、残りのデータは配列からのものである場合、これは難しいことです。これを行う1つの方法は、テーブルをリロードするときです。編集する場合は、行0を追加セルにし、後続セルの配列インデックスに行1を使用します。それを行う場合は、余分なセルを考慮してtableView:numberOfRowsInSection:に1を追加する必要があります。

もう1つの方法は、追加セルのセクションを作成することです。編集しないときは0行、それ以外の場合は1行、適切なセルを返すことになります。これはまた、あなたが見たいものに応じてテーブルとセルを適切に設定する必要があります。

+0

私は "-1"トリックを使用しています。元の投稿を編集して、reloadDataでsetEditingコードを表示しました。データをリロードしないと、2つのセル@ [0,0]があります。編集を開始/終了するときに、データを再読み込みするとアニメーションが「殺される」。 – johnnyspo

+0

テーブル全体をリロードする必要はありません。影響を受けるセクション/行を挿入/削除するだけです。データソースにも変更が反映されている場合、テーブルの整合性は自動的に保持されます。また、何かを傷つけることはありませんが、 'beginUpdates/endUpdates'は必要ありません。一度にアニメートする複数の変更を行う場合にのみ行います。あなたはただ一つの変更をしています。 – XJones

関連する問題