在折腾:
iOS中,将Table View的Table View Cell中的TextField换为下拉菜单
的过程中,出现了UIPickerView无法选中的问题:
但是鼠标按住UIPickerView,可以上下拖动:
但就是无法选择,鼠标滚轮也不起作用。
【解决过程】
1.把UIPickerView中的"Clip Subviews"选中:
再运行试试,结果问题依旧。
2.参考:
UIPickerView with custom View and labels not scrolling
去把"User Interaction Enabled"取消选择:
再去运行试试,结果还是无法选择。
3.再去取消选择Clip Subviews,结果也还是不行。
4.刚注意到,上面的的显示出来的UIPickerView好像有点重叠的效果,然后本来打算删掉UIPickerView全部重做的,结果发现删掉选中的UIPickerView后,发现底下还有一个。
那就是,至少刚才是由于不小心拖了2个UIPickerView了,所以如果导致诡异问题,那也是正常的了。
此时,就可以正常的用单个的UIPickerView去折腾了。
5.结果还是无法选择。
6.参考:
UIPicker selectRow not working – what’s wrong with this code?
去添加代码:
[self.birdNameChoosed selectRow:1 inComponent:0 animated:YES]; [self.birdNameChoosed reloadAllComponents];
然后运行试试,结果倒是可以实现正确的选择该项:
可是用鼠标还是无法选择。
7.参考:
UIPickerView is not scrolling when added to UIScrollView!
中的提示,好像UITableView嵌入到UIScrollView中可能会导致异常问题。
我此处的,算是将UIPickerView迁入到UITableView Cell中,估计也是属于此类吧。所以,看来要去找找UIPickerView和UITableView/UITableViewCell是否可以互相嵌入。
8.参考:
Adding a UIPickerView to a UITableView cell
去找到了官网的示例代码:DateCell,去参考参考。
然后打开项目,更新,编译,然后出现运行的效果:
经过尝试发现,此处也是滚轮是没用的,但是鼠标点击对应的上或下一项,则是可以滚动到对应位置的。
9.所以,对于原先自己的项目中,则是去尝试一下点击上一个或下一个,看看能否触发对应的didSelectRow函数。
其中,我之前就已经给didSelectRow打了断点,但是一直没有运行到。
结果验证了,点击上一个或下一个,UIPickerView还是无法滚动到对应的项,相反,好像鼠标点击事件,被UITableViewCell所捕获了:
所以最后UIPickerView还是无法使用。
看来,是需要想办法,让UIPickerView可以在UITableViewCell中使用,才能根本性地解决问题。
10.目前看来,好像只能是参考上述示例代码,去在Add Sighting这个界面载入的时候,在UITableViewCell中生成对应的UIPickerView.
11.参考DateCell的示例代码和UITableView reuseIdentifier,先去给UITableViewCell的indentifier添加了个名字,再去加个PickerView变量,Control+拖动建立outlet关系,
然后在写viewDidLoad中加上对应的代码:
if(self.birdNamePickerView.superview == nil) { CGRect startRect = CGRectMake(176, 130, 144, 216); self.birdNamePickerView.frame = startRect; UITableViewCell *birdNameCell = [self.addSightingTableView dequeueReusableCellWithIdentifier:@"BirdNameCell"]; [birdNameCell addSubview:(UIView *)self.birdNamePickerView]; }
结果的确就可以拖动对应的PickerView了:
对应的,之前的那个didSelectRow地方的断点,也是可以执行到的了。
不过还是有问题,那就是,选择了一次之后,之后就无法再选中到对应的PickerView了。
看来是UITableViewCell中的PickerView这个subView,第一次是可以获得鼠标的焦点的,选中了之后,好像就无法再获得焦点了。就无法再选取了。
12.后来还是觉得这样选择的方式不妥,所以,把PickerView移动到下面UITableView中了,然后使用起来,也很方便了:
这样用户体验还不错。
仍存问题是,点击BirdName项,键盘还是会跳出来,所以,再去优化,使得:
点击BirdName的值后,显示PickerView,然后鼠标焦点移开后,比如点击到Location的值,就消失。同时也就跳出对应的键盘了。
同时,试了试,对于BirdName的值,当前改变PickerView选项,是可以改变值的,同时也是允许编辑的。如果去掉键盘,应该就不可以编辑了,不过这样用户体验上来说,也是允许的。
除非以后支持除了选择之外的自定义的输入。
13.所以,现在已经解决了PickerView不能选择的问题了。
接下来,就是去优化,如何实现点击不同textField后,显示或消失对应的PickerView和键盘。
【总结】
(1)UIPickerView,如果将其放到一般的位置,比如UITableView中,则添加了初始化代码后,直接就可以正常工作的。
(2)如果将UIPickerView放到了一些相对特殊的位置,比如我这里把UIPickerView放到了UITableViewCell中了,则会导致鼠标只能选中UITableViewCell而无法选择到UIPickerView,所以也就无法选择UIPickerView中的项了。
解决办法是:专门定义个View,然后赋值给UIPickerView,然后把此View添加到UITableViewCell中,相关参考代码如下:
if(self.birdNamePickerView.superview == nil) { CGRect startRect = CGRectMake(176, 130, 144, 216); self.birdNamePickerView.frame = startRect; UITableViewCell *birdNameCell = [self.addSightingTableView dequeueReusableCellWithIdentifier:@"BirdNameCell"]; [birdNameCell addSubview:(UIView *)self.birdNamePickerView]; }
转载请注明:在路上 » 【已解决】UIPickerView无法/不能选择/选中