原型 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 包含多个部分 - 数据重复

无法单击 iOS 14 中 TableViewCell 内的按钮 [重复]

tableviewcell 内的 UIButton 触发单元格而不是按钮 [重复]