使用开关更改选择器视图的值
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)
【讨论】:
以上是关于使用开关更改选择器视图的值的主要内容,如果未能解决你的问题,请参考以下文章