2012-07-20 17 views
5

私は入力画像でセルを更新しようとしています。私は画像のDLingが完了したときに対応するメソッドを呼び出すプロトコルを持っています。 UITableのソースはオブジェクト "Meeting"のNSArrayです。私が保存されIndexPath Imは私にはないいくつかのNSMutable配列について述べている奇妙なエラーを取得してセルを更新しようとしているときに問題があるiphone UITable reloadRowsAtIndexPaths非常に奇妙な問題

(UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    Meeting * meeting = [tableDataSource objectAtIndex:indexPath.row]; 
... cell's init code 
    meeting.cellPath = indexPath; // also tried [indexPath copy]; 
... 
} 

- すべての会議は、私が取得そのテーブルセルのindexPathを保持しています

2012-07-20 20:15:18.007 MyNewbieApp[5734:207] meeting.cellPath = [row = 2,section = 0] 
2012-07-20 20:15:18.705 MyNewbieApp[5734:207] meeting.cellPath = [row = 4,section = 0] 
2012-07-20 20:15:18.728 MyNewbieApp[5734:207] meeting.cellPath = [row = 5,section = 0] 
2012-07-20 20:15:18.730 MyNewbieApp[5734:207] downloadDidFinishDownloading <NSIndexPath 0x79456f0> 2 indexes [0, 5] 
2012-07-20 20:15:18.732 MyNewbieApp[5734:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x02c70b99 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x02a6540e objc_exception_throw + 47 
    2 CoreFoundation      0x02c66695 -[__NSArrayM objectAtIndex:] + 261 
    3 UIKit        0x00556327 -[_UITableViewUpdateSupport(Private) _setupAnimationsForExistingVisibleCells] + 264 
    4 UIKit        0x00555b9b -[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:newRowData:oldRowRange:newRowRange:context:] + 436 
    5 UIKit        0x003ab5d6 -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:] + 1323 
    6 UIKit        0x003a7f03 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 9179 
    7 UIKit        0x003974d3 -[UITableView reloadRowsAtIndexPaths:withRowAnimation:] + 56 
    8 MyNewbieApp       0x00017354 -[MeetingsVC downloadDidFinishDownloading:] + 174 
    9 MyNewbieApp       0x000173a6 -[MeetingsVC download:didFailWithError:] + 43 
    10 MyNewbieApp       0x00010e5f -[Meeting image] + 317 
    11 MyNewbieApp       0x00016f49 -[MeetingsVC tableView:cellForRowAtIndexPath:] + 2141 
    12 UIKit        0x0039ed6f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 619 
    13 UIKit        0x00394e02 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 
    14 UIKit        0x003a9774 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561 
    15 UIKit        0x003a17ec -[UITableView layoutSubviews] + 242 
    16 QuartzCore       0x02619481 -[CALayer layoutSublayers] + 177 
    17 QuartzCore       0x026191b1 CALayerLayoutIfNeeded + 220 
    18 QuartzCore       0x026122e0 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 302 
    19 QuartzCore       0x02612040 _ZN2CA11Transaction6commitEv + 292 
    20 QuartzCore       0x02642ebb _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 
    21 CoreFoundation      0x02c51f4b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
    22 CoreFoundation      0x02be6b27 __CFRunLoopDoObservers + 295 
    23 CoreFoundation      0x02bafce7 __CFRunLoopRun + 1575 
    24 CoreFoundation      0x02baf350 CFRunLoopRunSpecific + 208 
    25 CoreFoundation      0x02baf271 CFRunLoopRunInMode + 97 
    26 GraphicsServices     0x0318000c GSEventRunModal + 217 
    27 GraphicsServices     0x031800d1 GSEventRun + 115 
    28 UIKit        0x0033baf2 UIApplicationMain + 1160 
    29 MyNewbieApp       0x00002034 main + 102 
    30 MyNewbieApp       0x00001fc5 start + 53 
) 
terminate called after throwing an instance of 'NSException' 

したがって、そのインデックス配列は範囲外です。私は3つの要素を持つNSMutableArrayを持っていません。すべての私の配列ははるかに大きいです。ああ、例外はここから出てくる:

- (void)downloadDidFinishDownloading:(Meeting *)meeting 
    { 
     NSLog(@"downloadDidFinishDownloading %@",meeting.cellPath); 
     //NSLog(@"downloadDidFinishDownloading meeting.cellPath = [row = %d,section = %d]",meeting.cellPath.row,meeting.cellPath.section); 

     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
     meeting.delegate = nil; 
    } 

- (void)download:(Meeting *)meeting didFailWithError:(NSError *)error{ 
    [self downloadDidFinishDownloading:meeting]; 
} 

このコールバックメソッドは、会議画像のDLingが完了するたびに呼び出されます。そして、reloadRowsAtIndexPathsを使ってコードラインをコメントすれば、すべてうまくいきます。それ以外の場合はエラーが発生します。何があってもかまいませんか?私はたくさんの時間を費やしましたが、役に立たないです...私はちょうど接着剤を持っていません... そして、さらに奇妙な問題は、常に5番目の要素で来ます:)私はテーブルの内容をスクロールしていますアップ。そして5番目の要素には何も特別なものはありません。すでに別のデータセットで試してみましたが、問題は残っています。

: エラー/クラッシュは、コードがdownload:(Meeting *)meeting didFailWithErrorメソッドを呼び出すときにのみ発生します。しかし、それは私がdownloadDidFinishDownloadingに送る同じ会議パラメータを持っています。

- (void)download:(Meeting *)meeting didFailWithError:(NSError *)error{ 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
      meeting.delegate = nil; 
} 

のでアプリが今だけreloadRowsAtIndexPathsで、この方法ではクラッシュ:私はまた、次の試してみました。

+0

をあなたのダウンロードが失敗した場合は、行をリロードしている理由は?行の中で何か変わったのですか? – moxy

+0

はい、スピナーを停止して隠し、 "DL err"と表示されたUILabelを表示します – Stan

答えて

0

アイデアは、あなたのデータソースオブジェクト「tableDataSource」セクション内の行の、特に数を更新する必要があるかもしれないということです

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

編集:

読書すると、あなたが「再利用可能なをコピー&ペーストすることができ、あなたの質問を促進cellForRowAtIndexPath内の「セル」の部分(実際はメソッド全体で、そこに問題があると思います)

+0

エラーが発生したときにはそこには到達しません。それは二重チェックされます。 reloadRowsAtIndexPathsアプリケーションの直後にアプリケーションがクラッシュします。 – Stan

+0

また、私のデータソースオブジェクト "tableDataSource"はNSArrayであり、要素の追加または削除を意味する意味で更新されていません。 – Stan

0

データソースに問題があると思います。 すべてのコードはどこに問題があると言うのが難しいです..私はあなたのためのヒントを持って、それはあなたのために役立つかもしれません。 Xcodeのブレークポイントタブで、左下にあるプラスボタンをクリックすると、ウィンドウがポップアップし、完了をクリックします。それがクラッシュしたときに、コードでアプリが破壊された場合

もう一度あなたのアプリを実行して、今、それはあなたがすでにまだ..それを持っている場合、私は知らない

...あなたのために指しています!

+0

私のデータソースオブジェクト "tableDataSource"はNSArrayであり、どんな要素の追加や削除の意味においても更新されていません。 – Stan

+0

NSArrayの内容を変更することはできません。NSArrayの内容をNSMutableArray ..に変更することはできません。 – NSPunk

+0

既にそれを試してみましたが、何もありませんでした。私はデータセットを変更しようとはしませんが、オブジェクトのいくつかのプロパティだけが含まれています – Stan

-1

これを試してみてください:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates] 
関連する問題