3

UITableView デリゲートとデータソースを別のクラス (メソッドによって呼び出された解析後に準備完了) から設定する必要がありますが、毎回テーブルが空になります。私はARCを使用していますが、これは単純化されたコードです:

//HomeViewController.h

#import <UIKit/UIKit.h>
#import "TableController.h"

@interface HomeViewController : UIViewController {

    IBOutlet UITableView *table;
    TableController *tableController;
}

@end

//HomeViewController.m

#import "HomeViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    tableController = [[TableController alloc] init];
    table.dataSource = tableController.tableSource.dataSource;
    table.delegate = tableController.tableSource.delegate;
    [tableController loadTable]; // HERE I CALL LOADTABLE FROM TABLECONTROLLER CLASS TO PARSE DATA AND POPULATE UITABLEVIEW
    [table reloadData];

}

// TableController.h

#import <UIKit/UIKit.h>

@interface TableController : NSObject <UITableViewDelegate, UITableViewDataSource> {

   UITableView *tableSource;

   // a lot of NSMutableArray to parse my data

}

- (void)loadTable;

@property (nonatomic, strong) UITableView *tableSource;

@end

//TableController.m

#import "TableController.h"
#import "AFNetworking.h"

@interface TableController ()

@end

@implementation TableController

@synthesize tableSource;

- (void)loadTable {

    NSURL *parseURL = // remote URL to parse Data
    NSURLRequest *request = [NSURLRequest requestWithURL:parseURL];
    AFJSONRequestOperation *parseOperation = [AFJSONRequestOperation
                                               JSONRequestOperationWithRequest:request
                                               success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

                                                   // code to parse Data and NSLog to test operation

                                                   [tableSource reloadData];
                                                   [tableSource setUserInteractionEnabled:YES];
                                                   [tableSource scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

                                               }
                                               failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                                   NSLog(@"%@", [error userInfo]);
                                               }];
    [parseOperation start];
    [tableSource setUserInteractionEnabled:NO];
}

そして、明らかに、まだ TableController.m にある、すべての古典的な UITableView デリゲート メソッド:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// my code
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// my code
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// my code
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
// my code
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// my code
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// my code
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// my code
}

解析は完璧ですが (NSLog でテストできます)、テーブルが空です。私を助けることができますか?

編集:私のコードloadTableでは、メソッドの解析は非同期であるため、すべてのデータが解析される前に、適切なデータソースとデリゲートを使用してテーブルをロードします。実際、固定のnumberOfRowsを設定してからSCROLL TABLEを実行すると、すべての行が入力されていることがわかります。しかし、HomeViewController をロードすると、*テーブルはまだ空です。

4

1 に答える 1

7

どこから/どのようにUITableView *tableSourceTableController にオブジェクトを設定していますか?

また、メインスレッドでテーブルビューをリロードしてみてください。

編集

HomeController viewDidLoad でこれらを変更します

   table.dataSource = tableController.tableSource.dataSource;
   table.delegate = tableController.tableSource.delegate;

   table.dataSource = tableController;
   table.delegate = tableController;

また、応答を取得したら、 &HomeControllerのデリゲートとしてクラスを設定します。テーブルビューをリロードするためにTableControllerメソッドを呼び出します(メインスレッドで)!!!HomeController

そのためには、最初property parentTableController .h fileこのように

@property(nonatomic,retain) id parent;

次に、 HomeController をHomeControllerviewDiDLoad のようにデリゲートとして設定します

tableController.parent = self.

完了ブロック呼び出しで応答が得られたら、

[self.parent reloadTableView];// reloadTableView は、HomeControllerを持つ関数になり[self.table reloadData]ます。

これで問題が解決することを願っています。

于 2013-03-14T11:54:22.457 に答える