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 をロードすると、*テーブルはまだ空です。