UITableView单元格中UISegmentedControl多次滚动后重叠的解决方法求助
解决UITableViewCell中UISegmentedControl滚动重叠的问题
兄弟,这个问题我太熟了——本质就是UITableView的单元格复用机制在搞事情!你现在的代码只在segDist为nil时创建分段控件,但当单元格被滚动出屏幕再滚回来时,系统会复用这个cell,此时segDist已经存在(属于之前的行),如果新的行不需要这个控件,或者需要的是别的配置,旧控件没被清理,新的又加上,自然就重叠了。
给你几个针对性的解决方案,按步骤来就能搞定:
1. 重写prepareForReuse方法,复用前彻底清理
UITableView在复用cell前会调用prepareForReuse,这是我们重置cell状态的最佳时机。在这里把旧的分段控件移除并置空,确保新的配置是干净的:
override func prepareForReuse() { super.prepareForReuse() // 移除旧的分段控件 segDist?.removeFromSuperview() // 置空引用,确保下次需要时重新创建 segDist = nil // 顺便重置其他可能复用的内容,比如文本标签 textLabel?.text = nil }
2. 确保分段控件正确添加到contentView并设置约束
创建分段控件后,一定要把它添加到cell的contentView(而不是cell本身),并设置好布局约束,避免位置混乱。比如在你的.DISTANCE case里补充:
case .DISTANCE: if segDist == nil { segDist = makeSegmentedControl(items:["yrds","m"], segmentIndex: SettingsManager.shared.getRangeUnitIndex() - 1, action: #selector(handleSegmentedControlActionDistance)) // 添加到contentView contentView.addSubview(segDist!) // 设置AutoLayout约束(根据你的需求调整) segDist?.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ segDist!.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16), segDist!.centerYAnchor.constraint(equalTo: contentView.centerYAnchor) ]) }
3. 处理非.DISTANCE的case,及时清理控件
在switch语句中,别忘了处理不需要分段控件的情况,确保旧控件被移除:
switch sectionType.containsSegmented { case .DISTANCE: // 你的创建和布局代码 default: // 当前行不需要分段控件,清理掉旧的 segDist?.removeFromSuperview() segDist = nil }
这样一套操作下来,不管怎么滚动tableView,每个cell都会根据当前的sectionType显示正确的控件,不会再出现重叠的问题了。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

