使用开关更改选择器视图的值

Posted

技术标签:

【中文标题】使用开关更改选择器视图的值【英文标题】:Changing pickerview's value using a switch 【发布时间】:2014-01-23 11:56:38 【问题描述】:

我有几个选择器视图和一个开关。我想做的是每次切换按钮时更改选择器的值。为简单起见,假设我想在开关打开时选择每个选择器的第二行,在开关关闭时选择每个选择器的第十行。从我过去几个小时收集的信息来看,这样做的方法如下:

// action called when the switch is toggled
- (void) switchToggled:(id)sender 

if ([sender isOn]) 
    [picker1 selectRow:2 inComponent:0 animated:YES]; 
    [picker2 selectRow:2 inComponent:0 animated:YES]; 
  
else 
    [picker1 selectRow:10 inComponent:0 animated:YES];    
    [picker2 selectRow:10 inComponent:0 animated:YES];    
  

不过,这似乎不起作用。我还注意到selectRow:inComponent 方法不会更改选择器的值,除非在绘制/重绘视图时调用它,或者从didSelectRow:inComponent 方法调用它时。

有什么想法吗?

【问题讨论】:

picker1 和 picker2 是 IBOutlets 吗?它们是否连接到 xib/storyboard 中的控件?需要连接控件及其委托。 【参考方案1】:

SelectRow: inComponent: animated: 一直在为我移动选择器,我已经做过很多这样的事情了。曾经让我感到困惑的是,它会在委托上触发 pickerview: didSelectRow: inComponent: ,我通常只希望在设置来自用户而不是我自己的代码时调用它。解决这个问题的方法是

picker.delegate = nil;
[picker selectRow:foo inComponent:bar animated:probably];
picker.delegate = thatObjectWhichWasDelegateAsecondAgo;

或者有一个 bool ivar,你可以简单地设置为 no,例如 listenToPicker,然后在 didselectrow..

-(void)pickerview:pickerview didSelectRow:row inComponent:component

if (listenToPicker)

///act on input



【讨论】:

这似乎仍然没有解决问题。有趣的是,当我尝试NSLog(@"%@", picker.delegate);时,输出是(null),即使在更改拾取器的值时调用委托方法(由用户)。这是应该的方式吗? 我敢打赌你的指针 picker1 和 picker2 坏了。 (已经被淘汰了)。委托返回 NULL 因为picker1 == nil。屏幕上有选择器,当然它们有委托/数据源,但是你的指针坏了。尝试使用 self.picker1 并合成一个属性(强,非原子) 尝试在选择行内记录... if (pickerview != picker1 && pickerview != picker2)NSLog @"I am getting messages from a rouge pickerview!"; 如果你遇到这种情况正如我上面推测的那样,您的指针存在保留问题,要么更好地保留它们,要么放弃变量并使用 self.view viewWithTag:myConstantTagForPicker1 .... 不,这不是问题所在。我已经在使用综合属性,并且 didselectrow 方法使用指针正确运行,因为我已经在使用它。我什至尝试过记录,没有问题。 记录每个选择器的委托确实会在 didselectrow 方法中返回一个值。【参考方案2】:
reloadAllComponents
reloadComponent:

这两种方法可用于重新加载 UIPickerview

对数据源数据类型进行更改,然后在切换事件上调用重新加载

【讨论】:

你不应该需要重新加载数据来移动选择器,一点也不。数据源并没有告诉选择器应该在组件 x 中选择哪一行,它不是一部分协议的一部分(实际上不是其中任何一个的一部分) 我已经试过了,还是不行。我相信 Jef 说的是真的:不需要重新加载组件来移动拾取器。【参考方案3】:

它应该可以工作。我使用了相同的方法,它对我有用。问题可能出在其他地方..

【讨论】:

【参考方案4】:

这在 ios9 中有所改变。如果你使用它会起作用:

        picker.selectRow(rowNum, inComponent: componentNum, animated: true)

【讨论】:

以上是关于使用开关更改选择器视图的值的主要内容,如果未能解决你的问题,请参考以下文章

Android——图片视图(ImageView)状态开关按钮(ToggleButton)时钟图片透明度滚动和时间选择器

onAppear 不允许保存/更新选择器值的更改?

使用可变数组中的值填充选择器视图

使用带有更改值的选择器视图的 JSON

日期/时间选择器不提供更改的值

如何更改引导日期选择器月视图以显示季度