UITableView 中的 iOS 13 UISegmentedControl 缓存先前的选择

Posted

技术标签:

【中文标题】UITableView 中的 iOS 13 UISegmentedControl 缓存先前的选择【英文标题】:iOS 13 UISegmentedControl inside UITableView caches previous selection 【发布时间】:2019-10-01 17:06:31 【问题描述】:

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

这里是 cellForRowAtIndexPath 函数的代码 sn-p,它在其中创建 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 上发生。

【问题讨论】:

我认为问题在于 UISegmentedControlNoSegment 在 iOS 13 上不起作用。这在其他堆栈溢出问题中有很好的记录。 @matt 说了什么。这是另一个解决该问题的问题:***.com/questions/57904625/… 【参考方案1】:

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

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

斯威夫特

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 方法中做到这一点

【讨论】:

在 prepareForUse 设置 selectedSegmentIndex 不起作用,我正在考虑您的第二个解决方案,关于在 prepareforreuse 中创建新控件,它会导致任何性能问题吗?我们有数百个这样的行。 好吧,如果您想优化,您只能在尝试重置为 .noSegment 时重新创建,否则将值设置为旧值。但对于性能问题,行数无关紧要(唯一重要的是可见行数以及我们滚动的速度或我们多久调用一次reloadData())确定的最佳方法是尝试并亲自看看 - 您也可以在 Instruments 上进行基准测试

以上是关于UITableView 中的 iOS 13 UISegmentedControl 缓存先前的选择的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中的 UISearchBar

iOS 13 - 当搜索主动推送到其他 VC 时,该 VC UITableView 在 Swift 4 中的 NavigationBar 下

iOS Xcode 中的 UIViewController 中的 UIView 中的 UITableView

UITableView没有窗口iOS13时的UITableViewAlertForLayoutOutsideViewHierarchy

支持 iOS 12 和 13 时的 UITableView 和 Diffable 数据源

UISearchController