最新消息:20190529 VPS服务器已从腾讯云香港换为Vultr新加坡,主题仍用朋友推荐的大前端D8

【已解决】UIPickerView无法/不能选择/选中

iOS crifan 1704浏览 0评论

在折腾:

iOS中,将Table View的Table View Cell中的TextField换为下拉菜单

的过程中,出现了UIPickerView无法选中的问题:

mouse scroll can not select

但是鼠标按住UIPickerView,可以上下拖动:

can drag down

但就是无法选择,鼠标滚轮也不起作用。

 

【解决过程】

1.把UIPickerView中的"Clip Subviews"选中:

enable clip subviews

再运行试试,结果问题依旧。

2.参考:

UIPickerView with custom View and labels not scrolling

去把"User Interaction Enabled"取消选择:

deselect 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];

然后运行试试,结果倒是可以实现正确的选择该项:

code sel work

可是用鼠标还是无法选择。

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,去参考参考。

然后打开项目,更新,编译,然后出现运行的效果:

click can sel

经过尝试发现,此处也是滚轮是没用的,但是鼠标点击对应的上或下一项,则是可以滚动到对应位置的。

9.所以,对于原先自己的项目中,则是去尝试一下点击上一个或下一个,看看能否触发对应的didSelectRow函数。

其中,我之前就已经给didSelectRow打了断点,但是一直没有运行到。

结果验证了,点击上一个或下一个,UIPickerView还是无法滚动到对应的项,相反,好像鼠标点击事件,被UITableViewCell所捕获了:

click capture by cell

所以最后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了:

can drag

 

对应的,之前的那个didSelectRow地方的断点,也是可以执行到的了。

不过还是有问题,那就是,选择了一次之后,之后就无法再选中到对应的PickerView了。

看来是UITableViewCell中的PickerView这个subView,第一次是可以获得鼠标的焦点的,选中了之后,好像就无法再获得焦点了。就无法再选取了。

12.后来还是觉得这样选择的方式不妥,所以,把PickerView移动到下面UITableView中了,然后使用起来,也很方便了:

move pickerview to 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无法/不能选择/选中

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

    66 queries in 0.128 seconds, using 18.83MB memory