iOS 13 UITableView 中的 UISegmentedControl 缓存了之前的选择

iOS 13 UISegmentedControl inside UITableView caches previous selection

我有一个带有 UITableView 的屏幕,每个可用数据元素显示一行,数据元素的数量可以是数百个。根据数据元素类型,每行显示一个输入字段或分段控件。 iOS 13 中的分段控件存在问题,当用户点击视图顶部分段控件行的第一段或第二段并向下滚动时,它会自动 select 一些 运行dom在后续滚动中分段控制行view/page。看起来好像控件状态没有刷新。

这里是 cellForRowAtIndexPath 函数的代码片段,它创建了 UISegmentedControl 行。

QuestionOnTopTableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:@"YesNoInputIdentifier"];
     if (!cell) {
        cell = [[QuestionOnTopTableViewCell alloc] initWithCellStyle:QuestionCellStyleYesNo reuseIdentifier:@"YesNoInputIdentifier"];
     }
     cell.titleLabel.text = row.title;
     cell.segmentControl.selectedSegmentIndex = row.answer ? row.answer.boolValue : UISegmentedControlNoSegment;

有人 运行 关注这个问题吗?

注意:此问题仅发生在 iOS13。

系统将只分配足够的单元格以供视觉显示,然后当一个单元格滚出时,它会重新使用它用于滚动进来的新单元格。因此,当发生这种情况时,它会记住您所看到的先前选择。

不确定为什么在 iOS 13 之前没有发生这种情况(看起来你的 cellForRowAt: 函数应该设置正确的值,如果你正在寻找正确的 row变量,但您应该能够通过覆盖 UITableViewCells prepareForReuse() 方法来重置它。

Swift

class QuestionOnTopTableViewCell: UITableViewCell {

     // stuffs

    override func prepareForReuse() {
        super.prepareForReuse()
        self.segmentControl.selectedSegmentIndex = .noSegment
    }
}

Obj-C

这应该适合你:

-(void)prepareForReuse{
    [super prepareForReuse];
    self.segmentControl.selectedSegmentIndex = UISegmentedControlNoSegment;
}

编辑:

我确实看到另一个问题声称 .noSegment 在 iOS13/Xcode 11 个构建上设置值后不再起作用:UISegmentedControl.noSegment stopped working with Xcode 11, iOS 13

不幸的是,您可能需要做的是每次重新创建分段控件的本地版本并覆盖该控件:cell.segmentControl = myNewJustCreatedSegmentControl

你也许仍然可以在 prepareForReuse 方法中做到这一点