为什么CellForRow:在Xcode 9.3中调用17次

时间:2018-05-10 03:41:34

标签: ios objective-c uitableview

我在Xcode 9.3上写了一个演示。模拟器是11.3。我创建了一个UITableView并实现了一个使用重用机制的代理方法。当我将单元格行高度设置为仅显示1个单元格并打印cellForRow:方法时。打印结果被调用17次。然后我使用旧版本的Xcode运行相同的代码,但它只被调用了2次。这意味着Xcode 9.3并没有真正实现单元重用机制。任何人都可以解释这个问题吗?

@interface ViewController () <UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) UITableView *tableView;

@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    if (!_tableView) {
        _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        _tableView.delegate = self;
        _tableView.dataSource = self;
        [self.view addSubview:_tableView];
    }
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //NSLog(@"%ld",indexPath.row);
    static NSString *idf = @"idf";
    //UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:idf];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:idf];
        NSLog(@"create");
    }
    return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 100;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 2000;
}
@end

输出:

2018-05-10 18:28:51.685711+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.697077+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.697953+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.698667+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.699238+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.699804+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.700625+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.701282+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.701997+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.702789+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.703488+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.704152+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.704767+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.705374+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.706024+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.706673+0800 TableviewDemo[65561:3827232] create
2018-05-10 18:28:51.707334+0800 TableviewDemo[65561:3827232] create

1 个答案:

答案 0 :(得分:0)

我从一个小演示中检查这个。如果代码

if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:idf];
    cell.contentView.backgroundColor = [UIColor cyanColor];
}

将调用tableview中的行数。但是只包含UITableViewCellContentView和_UITableViewCellSeparatorView。我希望这会对你有所帮助。