5

だから私は入ってくる画像でセルを更新しようとしています。画像のダウンロードが完了すると、対応するメソッドをコールバックするプロトコルがあります。UITable のソースは、オブジェクト「Meeting」の NSArray です。すべての会議は、私が取得したテーブルセルのindexPathを保持しています -

(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 でセルを更新しようとしているときに、持っていない NSMutable 配列に関する奇妙なエラーが表示されることです。

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'

そのため、その Index 配列は範囲外です。私は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];
}

このコールバック メソッドは、会議の画像のダウンロードが完了するたびに呼び出されます。そして、reloadRowsAtIndexPaths を使用してコード行にコメントを付けると、すべて正常に動作します。そうしないと、エラーが発生します。それは一体何なのだろうか?私は何時間も費やしましたが、それは役に立ちません...私はただ接着剤を持っていません...そして、さらに奇妙なことに、問題は常に5番目の要素で発生します:)テーブルの内容を上にスクロールすると. 5番目の要素には特別なことは何もありません。別のデータセットですでに試しましたが、問題は解決しません。

updated : エラー/クラッシュは、コードがメソッドをコールバックしたときにのみ発生します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 のこのメソッドでのみアプリがクラッシュするようになりました。

4

3 に答える 3

0

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

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

編集 :

あなたの質問をさらに読んで、cellForRowAtIndexPathの「再利用可能なセル」部分をコピーして貼り付けてもらえますか(実際にはメソッド全体、問題はそこにあると思います)

于 2012-07-20T17:01:49.070 に答える
0

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

アプリをもう一度実行すると、クラッシュしたときに、アプリが壊れているコードの場所が示されます...

あなたがすでに持っているかどうかはわかりません..しかし、それでも!

于 2012-07-20T17:15:39.173 に答える
-1

これを試して:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]
于 2013-09-26T04:09:38.213 に答える