如果调用 [tableView scrollToRowAtIndexPath:atScrollPosition:index animated:YES],为什么 UITableView 会创建冗余重用单元格

Why UITableView create redundant reuse cell if call [tableView scrollToRowAtIndexPath:atScrollPosition:index animated:YES]

提问人:李传师 提问时间:8/24/2022 最后编辑:Sham Dhiman李传师 更新时间:9/8/2022 访问量:55

问:

单元格数为 30,在 viewDidLoad 中滚动 5 秒后滚动到 15。UITableView 将在滚动到不可见单元格后创建冗余重用单元格。

ScreenShot

法典:

@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;
}

iOS Objective-C UITableView

评论

0赞 李传师 8/24/2022
任何人都应该能够复制它
0赞 DonMag 8/24/2022
这应该解释一下:stackoverflow.com/questions/58541582/......
0赞 Community 8/25/2022
请澄清您的具体问题或提供其他详细信息以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。

答:

0赞 DaniBatta 8/31/2022 #1

希望能很好地理解您的问题。

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 中的行数等于要显示的元素数。