0

セルが表示されたときにデータをアプリケーションにロードしようとしています。これにより、セルのアクセサリボタンを押すと、データがロードされます。

私の問題は、AFNetworkingを使用していて、次のブロックコードを使用していることです。

[Request fullRequestWithBlock:^(NSArray *detailedReqFromWeb, NSError *error) {
        if (error) {

            [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil) message:[error localizedDescription] delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"OK", nil), nil] show];
        } else {

            NSArray *objs = [NSArray arrayWithObjects: [detailedReqFromWeb objectAtIndex: 0], [detailedReqFromWeb objectAtIndex: 1], [detailedReqFromWeb objectAtIndex: 2], [detailedReqFromWeb objectAtIndex: 3], [detailedReqFromWeb objectAtIndex: 4], [detailedReqFromWeb objectAtIndex: 5], nil];
            NSArray *keys = [NSArray arrayWithObjects:@"Risk", @"Destination", @"Source", @"Customer", @"Subcategory", @"Deployment", nil];

            NSMutableDictionary *detailsforRequestDictionary = [[NSMutableDictionary alloc] initWithObjects:objs forKeys:keys];

            [request addEntriesFromDictionary: detailsforRequestDictionary];

            NSLog(@"%@ Finished Loading", [idNumbers objectAtIndex:row]);
            cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

        }

    } forID: [[idNumbers objectAtIndex:row] substringFromIndex:1]];

つまり、基本的には、データが読み込まれたら、アクセサリの種類をインジケーターから開示ボタンに変更して、読み込んだデータが表示される別のビューにセグエを実行できるようにします。

私の問題は、ロードが完了する前にcell.accessoryTypeをボタンに変更していることです。デバッグNSLogは、実際にロードが終了したときに実際に出力します。

ロードが完了したときにのみボタンを有効にする最良の方法は何ですか?リクエストはメインスレッドによって処理されていないと思います。リクエストの処理が終了したことが通知され、accessoryTypesを切り替えることができるのはなぜですか?

ありがとう!

4

1 に答える 1

4

セルをリサイクルしない限り、ユーザーがスクロールするとセル参照が表すデータが変化するため、セル参照を保持しないでください。正しい方法は、セクション/行座標でテーブル エントリを更新するメイン キューにブロックをディスパッチすることです。コードは、そのセルが表示されているかどうかを確認し、更新します。また、テーブルがスクロールするときに適切なステータスが適用されるように、他の方法でステータスを記録します。

于 2012-10-01T17:39:59.790 に答える