2011-06-22 5 views
26

私はcustomTableViewセルを持っています - (ネットワークイベントの発生に基づいて)セルで更新したいだけです。私は最初のネットワーク呼び出しを行う際にiOS UITableView "セルの2つのアニメーションを作成しようとしています" "

は、だから私は実行します。

- (void)makeNetworkCall 
{ 

     [self.tableView beginUpdates]; 

     // MAKE_NETWORK_CALL 

     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationNone]; 


     [self.tableView endUpdates]; // SIGABRT OCCURS HERE ON SECOND CALL 
} 

- (void)networkDataReturned:(NSDictionary*)dataReturned 
{ 
    // UPDATE_TABLE_VIEW_DATA_MODEL  

    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationNone]; 

    } 

これは、セルがタップされている場合が(したがって、再び結果をネットワークイベントを呼び出し、完全にネットワークイベントが呼び出された初めての作品これは今、キャッシュされている)、私は次のエラーを取得する:

2011-06-22 11:19:11.262 App[3991:707] *** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForExistingVisibleCells], /SourceCache/UIKit/UIKit-1448.89/UITableViewSupport.m:288 
2011-06-22 11:19:11.327 App[3991:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to create two animations for cell' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x32c7664f __exceptionPreprocess + 114 
    1 libobjc.A.dylib      0x36eb9c5d objc_exception_throw + 24 
    2 CoreFoundation      0x32c76491 +[NSException raise:format:arguments:] + 68 
    3 Foundation       0x32894573 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62 
    4 UIKit        0x35f59d3b -[_UITableViewUpdateSupport(Private) _setupAnimationsForExistingVisibleCells] + 402 
    5 UIKit        0x35f58b81 -[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:newRowData:oldRowRange:newRowRange:context:] + 296 
    6 UIKit        0x35f57dc1 -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:] + 972 
    7 UIKit        0x35f57473 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 4750 
    8 UIKit        0x35f612f9 -[UITableView endUpdatesWithContext:] + 28 
    9 UIKit        0x35f612d5 -[UITableView endUpdates] + 16 
    10 App        0x0005a033 -[CustomTableViewController tableView:didSelectRowAtIndexPath:] + 574 

答えて

2

それはあなたがそのエラーメッセージの原因となっているかを理解するのは難しいですが、別の方法にあなたのテーブルのリロードコードを移動してみて、どこというあなたを呼び出します2つの同一のコードブロックを持つようになりました。それは、UITableViewがそれ自身でフィルタリングすることになっている奇妙な競合状態のように見えるものを修正するかもしれない。

+0

下記の@jjramos replyを参照してください。それはおそらく、それほど不吉な状況ではないかもしれません。 – clearlight

2

とします。self.arTableDataは、表の可変配列です& tableViewUITableViewのインスタンスです。 tableViewに10行(配列内に10個のオブジェクトを意味する)があるとします。 アニメーション化された行を削除するには、次のコードを実装します。

int i; // to remove from 3 to 6 
for(i=2;i<6;i++) 
{ 
    [self.arTableData removeObjectAtIndex:i]; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationRight]; 
} 

複数行削除をする場合は、いないすべてを一度に1 &によって行を1つずつ削除してみてください。 複数の行(アニメーションを含む)を削除するとクラッシュする可能性があります。

しかし、行を挿入している間は、配列全体を渡して&を挿入することができます.UITableViewは確実にアニメーションを実行します。

このトリックは何の面倒もなく私のために働く。あなたのために同じように動作することを願っています。運が良かった。

+1

私のために働いた、ありがとう! –

+0

@Sparkループの前に[self.arTableData beginUpdates]を追加し、その後に[self.arTableData endUpdates]を追加すると、すべての削除操作が単一のアニメーションにバッチされます – imnk

54

この状況にもう一度遭遇する人は、reload、delete、またはinsertRowsAtIndexPathsに渡される配列にindexPathsが繰り返しないことを確認してください。

+0

パーフェクト、ありがとう! –

+0

素晴らしい返信です!比較的明確なものを見逃している間に、無駄な時間を無駄にすることなく、たくさんの時間を惜しまなかった。 IMO、Appleはあなたのヒントを含めるために、エラーメッセージのテキストを改善する必要があります。 – clearlight

+0

セクションにはパスが繰り返されていませんでしたが、セクションには間違った番号が付きました(セクションに '(NSUInteger)-1'として設定されました)。とにかく、あなたの答えは私に解決策を教えてくれた、ありがとう。 –

0

セクション内のインデックス-1の行を削除しようとしています。

0

私の場合、私はレストランのテーブルビューを持っており、ユーザーの現在地までの距離がわかります。距離は新しいユーザーの場所を受け取ると更新されます。これにより、ある瞬間に細胞が更新されます。ユーザがセルを再注文する場合、セルが更新されるのと同じ時間になる。 1つの細胞は2つの位置から操作される。これにより、プログラムがクラッシュしました。だから私はそれが編集モードであるかどうかを確認し、距離を更新しないでください。これが助けてくれるといいなあこれは、@ jjramosの回答の特定の条件の1つです。

関連する問題