2011-01-06 12 views
1

私は、ドメインオブジェクトに基づいて、私のテーブルビューから行を削除する方法を実現していますが、私は、コールdeleteRowsAtIndexPath後にエラーを取得しています:キャッチされない例外が原因アニメーションUITableView deleteRowsAtIndexPathモデルの更新時期は?

BLOCKQUOTE終端アプリ「NSInternalInconsistencyException」、理由: '無効な更新:セクション0の行数が無効です。更新(2)後の既存のセクションに含まれる行の数は、更新前のそのセクションに含まれる行の数(2)に等しいか、そのセクションから挿入または削除された行の数(挿入された0、削除された1)。

私は「ok、私はモデルをあまりにも早く更新している」と思った。コード:

- (void)deleteItem:(Item *)item { 
    NSInteger index = [items indexOfObject:item]; // items is the model a NSArray 
    if (index != NSNotFound) { 
     NSMutableArray *itemEditable = [items mutableCopy]; 
     [itemEditable removeObjectAtIndex:index]; 
     self.items = itemEditable; 

     NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:index inSection:0]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationMiddle]; 
    } 
} 

そして私は私がdeleteRowsAtIndexPath呼び出す後のモデル更新するためのコードを変更:

- (void)deleteItem:(Item *)item { 
    NSInteger index = [items indexOfObject:item]; // items is the model a NSArray 
    if (index != NSNotFound) { 
     NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:index inSection:0]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationMiddle]; 

     NSMutableArray *itemEditable = [items mutableCopy]; 
     [itemEditable removeObjectAtIndex:index]; 
     self.items = itemEditable; 

    } 
} 

をアニメーションしかし、それは解決しなかった、変更する唯一のものは数字をキャッチされない例外により「NSInternalInconsistencyException」2〜3

BLOCKQUOTE終端アプリケーションへのエラーメッセージの行、理由:「無効な更新:無効な数update(3)の後の既存のセクションに含まれる行の数は、update(3)の前にそのセクションに含まれる行の数にプラスまたはマイナスの挿入または削除された行の数と等しくなければなりません(挿入された0、削除された1)。

ここでモデルを更新する必要がありますか?


追加numberOfRowsInSection方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [items count]; 
} 
+0

モデルはdeleteRowsAtIndexPathの前に更新する必要があります。 numberOfRowsInSectionメソッドを投稿できますか? – Anna

+0

もちろん、できました。 –

答えて

3

私は問題を発見しました。 Itemsプロパティの設定が実装されてreloadDataを呼び出すと、この混乱の原因となりました。

-(void) setItens:(NSMutableArray *)newItens{ 
    if (itens != nil) { 
     [itens release]; 
     itens = nil; 
    } 
    itens = [newItens copy]; 
// [tableView reloadData]; // WRONG don't do this 
} 

これは、私はここに質問を公開した後、間違って何をやっていた私が見つけた二度目です。私はこれがいつか誰かを助けることを願っています

- (void)deleteItem:(Item *)item 
{ 
     .......................your code.............. 

    [tableView reloadData]; 
} 

はそれが必要、これを試してみてください、

私は意味:おかげでaBitObvious、私はaBitShyだ今:)

+9

心配しないで@Felipe。私はオフィスマスコットとして保管していた小さなゴムを持っていた開発会社について聞いたことがあります。このポリシーは、あなたが問題をもって他の誰かに迷惑をかける前に、それをダッキーに説明しなければならなかった。そしてダッキーが何回問題を解決したのかは驚くべきことでした!ポイントは、あなたの問題を他の誰かに説明するのに十分な問題を定式化することは、必要な "ああ"の瞬間を持っていることを十分理解することです。 –

-1

私はあなただけで削除された行の下にそれをリロードする必要がある行を削除した後だと思います作業。

+0

いいえ、deleteメソッドとinsertメソッドはすでにreloadDataでこれを行う必要はありません。 –

関連する問題