UITableView内的iOS 13 UISegmentedControl会缓存先前的选择

时间:2019-10-01 17:06:31

标签: ios uisegmentedcontrol ios13

我有一个带有UITableView的屏幕,每个可用的数据元素显示一行,数据元素的数量可以成百上千。根据数据元素类型,每行显示一个输入字段或分段控件。 iOS 13中的分段控件存在问题,当用户点击视图顶部的分段控件行的第一段或第二段并向下滚动时,它将为后续滚动视图中的某个随机分段控件行自动选择第一段/页。看起来好像控件状态没有刷新。

这是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上发生。

1 个答案:

答案 0 :(得分:1)

系统将只分配足够的单元格以可视方式显示,然后当滚动一个单元格时,它将重新使用它以滚动新单元格。结果-当发生这种情况时,它会记住您所看到的先前的选择。

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

迅速

prepareForReuse()

Obj-C

这应该对您有用:

class QuestionOnTopTableViewCell: UITableViewCell {

     // stuffs

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

编辑:

我实际上确实看到另一个问题,声称在iOS13 / Xcode 11构建中设置了值之后,-(void)prepareForReuse{ [super prepareForReuse]; self.segmentControl.selectedSegmentIndex = UISegmentedControlNoSegment; } 不再起作用:UISegmentedControl.noSegment stopped working with Xcode 11, iOS 13

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

您也许仍然可以使用cell.segmentControl = myNewJustCreatedSegmentControl方法