提问人:李传师 提问时间:8/24/2022 最后编辑:Sham Dhiman李传师 更新时间:9/8/2022 访问量:55
如果调用 [tableView scrollToRowAtIndexPath:atScrollPosition:index animated:YES],为什么 UITableView 会创建冗余重用单元格
Why UITableView create redundant reuse cell if call [tableView scrollToRowAtIndexPath:atScrollPosition:index animated:YES]
问:
单元格数为 30,在 viewDidLoad 中滚动 5 秒后滚动到 15。UITableView 将在滚动到不可见单元格后创建冗余重用单元格。
法典:
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.view addSubview:self.tableView];
self.tableView.frame = self.view.frame;
self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = UIColor.whiteColor;
self.tableView.estimatedRowHeight = 52;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass(UITableViewCell.class)];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:15 inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
});
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 30;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(UITableViewCell.class)];
cell.backgroundColor = [self.class randomColorWithAlpha:1];
return cell;
}
答:
希望能很好地理解您的问题。
Objective-c 中的 UITableViewController 负责获取要在单元格内显示的数据。事实上,在大多数情况下,它是“数据委托”。
好吧,为了节省内存和资源,Objective-C 会自动“重用”先前分配的单元。这意味着表中的第一个单元格将是唯一使用内存的单元格。若要显示所有其他单元格,TableViewController 将对分配的第一个单元格进行处理。
分配每个单元格是没有效率的。TableView 通常用于显示 dinamic 内容,因此假设您的程序需要分配 150 个不同的 UITableViewCell:您的应用程序可能会崩溃或运行缓慢。
正如你在这里看到的:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(UITableViewCell.class)];
你调用“dequeReusableCellWithIdentifier”,其中“reusable”这个词的意思是我之前说的。
让我给你一些关于结构良好的项目的建议:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //here call a method that returns you the number of elements you want to display }
返回常量值(如 30)不是一个好的做法。始终确保 section 中的行数等于要显示的元素数。
评论