0

サムネイル画像を含むリストビューを使用しています。また、すべての情報を取得するために Web サービスを使用しています。

cellForRowAtIndexPath メソッドで、サービスを呼び出してレコードを取得し、画像が添付されているかどうかを確認します。これはただのブールです。次に、別のメソッドを使用してサービスを再度呼び出し、サムネイルを取得します。すべてのロジックが正しい順序で配置されているように見えますが、画像は間違ったセルに表示され、複製されています。

コードをステップ実行してデバッグすると、各セルのサービス呼び出しが起動され、応答アクションにジャンプするのではなく、次の行/セルに移動するように見えます。すべての行が入力されると、応答に進みます。これはデバッガにとって正常ですか? サービスへの呼び出しが非同期である可能性がありますが、それが理由でしょうか? 石鹸の「ライブラリ」が含まれていますが、どこにも名前が付けられていないようで、非同期要求を実行していないようです。これは、このアプリケーションにとってはばかげています。このプロジェクトはサードパーティの開発者から継承しました。

また、私は .net 開発者であり、Visual Studio デバッガーに慣れているため、問題が発生している可能性があります。

私はiosとobj-cにかなり慣れていないので、私の用語が正しくない場合は申し訳ありません。

コード: 画像を取得するためのサービス呼び出し:

[service GetPictureThumbnail:self action:@selector(GetThumbResponse:) clientid: [AppDelegate clientID] commid:[UserSettings getInstance].selectedID mod:@"CCR" pkey:_ccr.l maxWidth:94 maxHeight:98];

GetThumbResponse:

// Handle errors
if([value isKindOfClass:[NSError class]]) {
    NSLog(@"%@", value);
}

// Handle faults
if([value isKindOfClass:[SoapFault class]]) {
    NSLog(@"%@", value);
}


// Do something with the NSString* result
Picture_Object* result = (Picture_Object*)value;
NSLog(@"%@", result);
[_cell.imgThumb setImage:[UIImage imageWithData:result.e]];

セル内の他のすべてのデータは問題ありませんが、サービスへの最初の呼び出しに含まれないのは画像だけです。

ありがとう。

4

1 に答える 1

1

私の経験上、cellForRowAtIndexPath:で処理を行うのは良くありません。

上下にスクロールするたびに、セルが更新され、そのメソッドが何度も呼び出されるため、奇妙な矛盾が生じます。セルにデータを入力する最良の方法 (これも私の経験に基づくもので、すべての人と一致しない可能性があります) は、セルに表示されるデータを保持する独自のメソッドで配列を準備することです。したがって、 cellForRow: を呼び出すと、以下のようなデータが得られます。

[imageArray objectAtIndex:[indexPath row]];

そうすれば、上下にスクロールするときに、常にネットワーク リクエストを実行するのではなく、配列からデータを取り出してセルに表示するだけです。

そのメソッドの外でデータの処理を開始するまで、これにはあらゆる種類の問題がありました。もっと早く知っていれば、多くの悲しみを救ってくれたのに。

これはあなたの質問に対する直接的な答えではないかもしれませんが、tableViews にアプローチするためのより良い方法です (特に、セル/tableViews が複雑になり始めた場合)。

*編集: ネットワーク リクエストの後、およびデータを配列に処理した後に、必ず以下の行を呼び出してください。

[_tableView reloadData];
于 2013-08-12T22:14:13.603 に答える