当我尝试从Web服务数据填充 UITableView 时出现问题。
我有这种方法。
#pragma UITableView methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"count... %i-%@-%@",[self.tweets count], _myTable.delegate, _myTable.dataSource);
return [self.tweets count];
}
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 95;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Cell...");
static NSString *cellIdentifier = @"Cell";
TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[TweetCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
if ([self.tweets count] != 0) {
SBTVTweets *current_tweet = [self.tweets objectAtIndex:indexPath.row];
cell.username.text = current_tweet.name;
}
return cell;
}
//Clicked Row in the Table View action
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Clicked");
}
在这种方法中,我调用了方法 reloadData
-(Table *)initWithTweets:(NSArray *)tweets{
self = [self init];
if (self) {
self.tweets = [tweets copy];
}
[self.myTable reloadData];
return self;
}
这是我表的 IBOutlet
@property (weak, nonatomic) IBOutlet UITableView *myTable;
在我的档案 .h 我有这个。
@interface Table : UIView <UITableViewDataSource, UITableViewDelegate>
执行时,日志显示:
2014-10-20 12:52:37.026 NuncheeTestsApp[15717:110695] count... 0-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>
2014-10-20 12:52:37.033 NuncheeTestsApp[15717:110695] count... 0-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>
2014-10-20 12:52:39.518 NuncheeTestsApp[15717:110695] count... 20-<Table: 0x7c1a7ba0; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c1949c0>>-<Table: 0x7c1a7ba0; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c1949c0>
第三次填充数组,但委托和 dataSource 已更改, UITableVIew 未显示任何内容。我不知道......
任何想法。
感谢。
答案 0 :(得分:0)
首先,我要说不要从初始化程序中调用reloadData
。你最好在viewDidLoad
中调用它:
- (void)viewDidLoad {
[super viewDidLoad];
[self.myTable reloadData];
}
其次,如果您使用UITableViewController
或仅UIViewController
,我就无法发布您发布的内容。如果是后者,您需要自己设置委托和数据源:
- (void)viewDidLoad {
[super viewDidLoad];
self.myTable.delegate = self;
self.myTable.dataSource = self;
[self.myTable reloadData];
}
此外,由于几个版本之前您可以使用dequeueReusableCellWithIdentifier:forIndexPath:
来处理 nil 案例:
static NSString *cellIdentifier = @"Cell";
- (void)viewDidLoad {
[super viewDidLoad];
self.myTable.delegate = self;
self.myTable.dataSource = self;
[self.myTable registerClass:[TweetCell class] forCellReuseIdentifier: cellIdentifier];
[self.myTable reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
if ([self.tweets count] != 0) {
SBTVTweets *current_tweet = [self.tweets objectAtIndex:indexPath.row];
cell.username.text = current_tweet.name;
}
return cell;
}
希望有所帮助。
修改强>
我刚刚意识到你为所有这些代码继承了UIView
。正如我上面提到的,可能最容易将UITableViewController
子类化,这已经符合UITableViewDataSource
和UITableViewDelegate
协议。它还会为您添加UITableView
。