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
变量,但您应该能够通过覆盖 UITableViewCell
s 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
方法中做到这一点
我有一个带有 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
变量,但您应该能够通过覆盖 UITableViewCell
s 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
方法中做到这一点