我有一个包含选择器和工具栏的UIActionSheet。在UIToolBar上有一个保存按钮。然而,我的一些用户报告说在UIPickerView停止旋转之前按下保存按钮,因此只能检索初始值(旋转之前)。
是否有办法在用户点击保存时获取UIPickerView当前选定的项目或在其旋转时获取活动选定项目的反馈?
谢谢
我有一个包含选择器和工具栏的UIActionSheet。在UIToolBar上有一个保存按钮。然而,我的一些用户报告说在UIPickerView停止旋转之前按下保存按钮,因此只能检索初始值(旋转之前)。
是否有办法在用户点击保存时获取UIPickerView当前选定的项目或在其旋转时获取活动选定项目的反馈?
谢谢
titleForRow
方法来解决这个问题。当pickerview
滚动时,你的titleForRow
方法被调用以填充当前查看行以上或以下的行(取决于选择器旋转的方向)。当选择器停止时,didSelectRow
方法被调用,并且返回的行是在titleForRow
方法中填充的最后一行的后面两行。
我认为你可以选择在滚动到某个点时停止选择器(使用计时器检测点,用于告诉titleForRow
中的代码捕获组件和行),然后执行selectRow
将值设置为你希望它在停止旋转后的值(并且会调用didSelectRow
)。
刚刚找到了解决方案,适用于我的情况。当用户取消选择器后,我不需要最后一个更新事件,因为它会在选择器停止旋转时生成。因此,这种方法停止滚动并且不会引起新的更新选择事件。看起来你将在此之后检查选择器中的选择是否正确(我不在意,在显示选择器时我会重新选择值)。
- (void)_resetPickerViewDelegates {
id delegate = [_pickerView.delegate retain];
id dataSource = [_pickerView.dataSource retain];
_pickerView.delegate = nil;
_pickerView.dataSource = nil;
[_pickerView reloadAllComponents];
_pickerView.delegate = delegate;
_pickerView.dataSource = dataSource;
[delegate release];
[dataSource release];
}
我曾经遇到过同样的问题... 我通过在关闭或选择选取器值的方法中简单地添加以下代码行来解决它。
[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES];
我认为这不是你能够仅通过UIPickerView
解决的问题。
除非动画停止(因此选择器视图选择了它停在的行),否则无法知道选择了哪一行。唯一的方法是告诉选择器停在哪一行,使用selectRow:inComponent:animated:
但是你怎么知道那是哪一行?因为选择器正在旋转,所以你不知道...
我认为这只是UIPickerView
的限制,苹果可能会将其描述为预期行为。
[component1Array objectAtIndex:[myPicker selectedRowInComponent:1]];
在这里,
"[myPicker selectedRowInComponent:2]" 将返回当前从 myPicker 中的组件 '2' 选择的原始编号。 您可以通过以下方式检索组件2中选定的对象
[component2Array objectAtIndex:[myPicker selectedRowInComponent:2]];
UIPicker
,但可以更改它操作的对象。UIPicker
时,根据它应该更新的对象为其分配一个唯一的tag
。- (void)updatePickerView:(UIPickerView*)pickerView
{
...
pickerView.tag = [self.myObject.position integerValue];
[pickerView selectRow:i inComponent:0 animated:NO];
}
然后当它完成旋转时,我会检查标签是否仍然对齐。
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (pickerView.tag == [self.myObject.position integerValue]) {
...
}
}
我不确定苹果的这个功能是如何运作的,但这对我来说已经足够使其正常工作了。
另外一件事,我不确定这是否重要,但我的 UIPicker
在一个 UITableViewCell
中,但由于它是可重用的单元格,并且因为我遇到了问题,我假设当 UIPicker 从一个位置移动到另一个位置时是相同的(因为屏幕上一次只有一个)。
var isSpinning = false (Global)
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
self.isSpinning = true
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.isSpinning = false
}
i
执行以下操作会发生什么?[picker selectRow:[picker selectedRowInComponent:i] inComponent:i animated:YES];
- nacho4d