UITableView重新加载数据不会触发所有cellForRowAtIndexPath指令

时间:2015-06-22 14:47:15

标签: ios objective-c uitableview

编辑:使一切更清晰,提供日志,为方法添加更多细节。

我在tableview:cellForRowAtIndexPath:

中有这段代码
[self.menuTable registerNib:[UINib nibWithNibName:@"CustomCellNotif" bundle:nil] forCellReuseIdentifier:@"notifCell"];

UITableViewCell *cell = [[UITableViewCell alloc] init];
cell.selectionStyle = UITableViewCellSelectionStyleNone;

cell = [tableView dequeueReusableCellWithIdentifier:@"notifCell"];
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
if (loaded == 2) {
    DLOG(@"loaded 2");            

    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 2;
    cell.textLabel.font = [UIFont systemFontOfSize:cell.bounds.size.height*30/100];
    cell.textLabel.text = @"some text";

    cell.detailTextLabel.font = [UIFont italicSystemFontOfSize:cell.bounds.size.height*20/100];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm"];

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:(mydate / 1000)];

    NSString *formattedDateString = [dateFormatter stringFromDate:date];
    cell.detailTextLabel.text = formattedDateString;

} else if (loaded == 4) {
    DLOG(@"loaded 4");
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 2;
    cell.textLabel.font = [UIFont systemFontOfSize:cell.bounds.size.height*30/100];
    cell.textLabel.text = @"Loaded 4";
    cell.detailTextLabel.font = [UIFont italicSystemFontOfSize:cell.bounds.size.height*20/100];
    cell.detailTextLabel.text = @"Loaded 4";
} else {
    DLOG(@"loaded 0");

    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 2;
    cell.textLabel.font = [UIFont systemFontOfSize:cell.bounds.size.height*30/100];
    cell.textLabel.text = @"NOthing";
    cell.detailTextLabel.text = @"";
}

我正在使用包含此内容的另一种方法获取数据:

/* request is here */
if (error != nil) {
     DLOG(@"error :%@",error);

     loaded = 4;

     [self.tableView reloadData];

 } else {

     DLOG(@"Success! Response from the back");
     /* ... fetching data */
 }

 if ([self.listResult count] == 0) {
      loaded = 0;
 } else {
      loaded = 2;
 }
DLOG(@"loaded : %i", loaded);
[self.tableView reloadData];

我的日志看起来像这样:

2015-06-23 10:07:47.279 myproject[199:11514] __54-[MyTableViewController fetchData]_block_invoke: Success! Response from the back
2015-06-23 10:07:47.280 myproject[199:11514] __54-[MyTableViewController fetchData]_block_invoke: loaded : 2
2015-06-23 10:07:47.282 myproject[199:11514] -[MyTableViewController tableView:numberOfRowsInSection:]: 
2015-06-23 10:07:47.283 myproject[199:11514] -[MyTableViewController tableView:numberOfRowsInSection:]: 
2015-06-23 10:07:47.288 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: 
2015-06-23 10:07:47.289 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: loaded 2
2015-06-23 10:07:47.301 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: 
2015-06-23 10:07:47.305 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: loaded 2
2015-06-23 10:07:47.351 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: 
2015-06-23 10:07:47.355 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: loaded 2
2015-06-23 10:07:47.395 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: 
2015-06-23 10:07:47.399 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: loaded 2
2015-06-23 10:07:47.439 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: 
2015-06-23 10:07:47.443 myproject[199:11514] -[MyTableViewController tableView:cellForRowAtIndexPath:]: loaded 2

我的5个单元格带有文本,我唯一的问题是只有第一个具有良好的字体大小,其他将是默认字体大小。但是,如果我转到另一个视图并返回(触发完全相同的动作),一切都很好。如何在第一次通话时获得好的字体?

3 个答案:

答案 0 :(得分:0)

首次使用时:

[tableView dequeueReusableCellWithIdentifier:@"notifCell"];
如果返回nil,

要求您实现单元格创建。

使用始终返回单元格的dequeueReusableCellWithIdentifier:forIndexPath

您的解决方案是致电

[tableView reloadData]

会重新加载所有可见的单元格,但您需要确保在将loaded设置为所需值后调用它,而不是在此之前。

还要确保tableView:numberOfRowsInSection为您的案例返回适当数量的行。

答案 1 :(得分:0)

这是我发现的,事实上cell.bounds.size.height一直都是错的,因为

tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

被称为AFTER

tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

这就是为什么字体大小与单元格高度的百分比有误。现在我只需要找到一种方法在另一种方法之前调用heightForRow。

答案 2 :(得分:0)

用户回答的解决方案是将高度存储在NSMutableArray中,然后在cellForRowAtIndexPath中使用它,这意味着在重新加载表之前先计算高度。

然后在cellForRowAtIndexPath下面会看起来像:

eq:NSMutableArray *heights;保持计算的高度

cell.textLabel.font = [UIFont systemFontOfSize: ([heights[indexPath.row] floatValue]) * (30/100) ];