原型 tableviewcell 内的 UIPickerView 没有选择指示器
Posted
技术标签:
【中文标题】原型 tableviewcell 内的 UIPickerView 没有选择指示器【英文标题】:UIPickerView inside prototype tableviewcell has no selection indicator 【发布时间】:2016-11-19 18:35:30 【问题描述】:我有一个表格视图控制器,它有多个原型单元格用于不同的输入控件,如 UISwitch、UITextField 和 UIPickerView,当加载视图时,我确定需要哪个控件并只显示一个原型单元格。
但是对于带有 UIPickerView 的单元格,我无法显示选择指示器,并且选择器视图最终看起来像这样:
在我的tableView:cellForRowAtIndexPath:
方法中,我明确启用了选择指示器:
UIPickerView * pickerView = [cell viewWithTag:InputTagPicker];
pickerView.dataSource = self;
pickerView.delegate = self;
[pickerView selectRow:self.pickerInitialIndex inComponent:0 animated:YES];
[pickerView setShowsSelectionIndicator:YES];
为什么选择指示器不显示?
【问题讨论】:
您解决了这个问题吗?我有完全相同的问题,我无法在任何地方找到解决方案。 UIPickerView selection indicator not visible in ios10的可能重复 【参考方案1】:我遇到了类似的问题。我注意到每次我滑动到不同的标签时,这个问题都会消失。这意味着当 tableview(cell) 出现在视图中时,发生了一些有趣的事情。
由于 UITableViewCell 没有 viewWillAppear() 方法,我设法通过从单元格的子视图列表中强制删除 pickerView 然后将其添加回来来解决此问题。这模拟了在将pickerView作为子视图添加到单元格之前设置选择的过程,并修复了问题。
您可以尝试以下方法:
UIPickerView * pickerView = [cell viewWithTag:InputTagPicker];
pickerView.dataSource = self;
pickerView.delegate = self;
[pickerView selectRow:self.pickerInitialIndex inComponent:0 animated:YES];
[pickerView setShowsSelectionIndicator:YES];
// hack to make sure the selection indicator shows
// first remove the picker
[pickerView removeFromSuperview];
// then add it back
[cell.contentView addSubview:pickerView];
但是,这会创建粘在单元格左边缘的选择器,因此您需要以编程方式设置约束
// finally set the constraints to make sure it fits horizontally centered
//Trailing
NSLayoutConstraint *trailing =[NSLayoutConstraint
constraintWithItem:pickerView
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:cell.contentView
attribute:NSLayoutAttributeTrailing
multiplier:1.0f
constant:0.f];
//Leading
NSLayoutConstraint *leading = [NSLayoutConstraint
constraintWithItem:pickerView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:cell.contentView
attribute:NSLayoutAttributeLeading
multiplier:1.0f
constant:0.f];
//Center Y
NSLayoutConstraint *centerY = [NSLayoutConstraint
constraintWithItem:pickerView
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:cell.contentView
attribute:NSLayoutAttributeCenterY
multiplier:1.0f
constant:0.f];
[cell.contentView addConstraints:trailing];
[cell.contentView addConstraints:leading];
[cell.contentView addConstraints:centerY];
这是一个 Swift 4 版本:
// first remove the picker
pickerView?.removeFromSuperview()
// then add it back
cell.contentView.addSubview(pickerView!)
// and finally set the constraints to make sure it fits horizontally centered
cell.contentView.addConstraints([NSLayoutConstraint.init(item: pickerView as Any, attribute: .centerY, relatedBy: .equal, toItem: cell.contentView, attribute: .centerY, multiplier: 1, constant: 0),
NSLayoutConstraint.init(item: pickerView as Any, attribute: .trailing, relatedBy: .equal, toItem: cell.contentView, attribute: .trailing, multiplier: 1, constant: 0),
NSLayoutConstraint.init(item: pickerView as Any, attribute: .leading, relatedBy: .equal, toItem: cell.contentView, attribute: .leading, multiplier: 1, constant: 0)])
【讨论】:
以上是关于原型 tableviewcell 内的 UIPickerView 没有选择指示器的主要内容,如果未能解决你的问题,请参考以下文章
TableViewCell 内的 CollectionView
未调用 TableViewCell 内的 UICollectionView
更改 TableViewCell 内的 UIPageControl 的 CurrentPage 时出现问题
TableViewCell 内的 UItextField 包含多个部分 - 数据重复