以编程方式停止iphone上的uipickerview动画

时间:2011-01-30 02:42:50

标签: iphone uipickerview uitoolbar uiactionsheet uipicker

我有一个包含选择器和UIToolbar的UIActionSheet。在UIToolBar上有一个保存按钮。但是,我的一些用户报告在UIPickerView停止旋转之前按下保存按钮,因此只检索初始值(旋转前)。

一旦用户点击保存或获取活动所选项目的反馈,是否有办法获取当前所选的UIPickerView项目?

由于

8 个答案:

答案 0 :(得分:4)

即使它们仍在旋转时它们会解除拾取器,但是一旦它停止,拾取器仍然会使用最终选定的行调用该委托,即使它不可见。假设您还没有解除分配,可以设置委托接收器以检查选择器是否可见,如果不可见,则保存所选值。

我这样做是假设用户没有滚动到一个随机值 - 通常当他们滚动和解散而不等待它结算时,这意味着他们滚动到列表的最顶部或最底部。我会说你可以在这两种情况下安全地使用委托的结果。

答案 1 :(得分:2)

你有没有想过使用titleForRow方法搞清楚这一点。当pickerview滚动时,正在调用titleForRow方法来填充当前查看行上方或下方的行(取决于选择器旋转的方式)。当选择器停止时,将调用didSelectRow方法,并返回的行是titleForRow方法中填充的最后一行的2行。

我认为您可以选择在某个时刻停止选择器(定时器以检测用于在titleForRow中告诉代码以捕获来自调用的组件和行的点)然后执行selectRow将值设置为停止旋转后的所需值(并调用didSelectRow)。

答案 2 :(得分:1)

我不认为这是一个问题,你可以用UIPickerView单独解决。

现在无法在没有动画停止的情况下选择哪一行(因此选择器视图选择它停止的行)。唯一的方法是通过使用selectRow:inComponent:animated:告诉选择器哪一行停止,但你怎么知道哪一行?你不知道因为拣货员在旋转......

我认为这只是UIPickerView的限制,Apple可能会将其描述为预期的行为。

答案 3 :(得分:1)

我有同样的问题...... 我通过简单地在关闭或选择选择器值的方法上添加以下代码行来修复它。

[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES];

答案 4 :(得分:1)

刚刚找到解决方案,适用于我的情况。我不需要上次更新事件,当用户解除它后,当选择器停止旋转时生成。因此,此方法停止滚动,不会导致新的更新选择事件。看起来你会在这之后检查选择器是否正常(我不在乎,我在显示选择器时重新选择值)。

- (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];    
}

答案 5 :(得分:0)

点击“保存”按钮,您可以通过

从组件中检索所选对象
[component1Array objectAtIndex:[myPicker selectedRowInComponent:1]];

其中,

  • “component1Array”是NSArray或 NSMutableArray,曾经的对象 显示对象(原始内容) 你的组件。
  • “myPicker”是UIPickerView对象 显示选择器。
  • “[myPicker selectedRowInComponent:1]” 将返回当前选中的 来自组件中myPicker的raw no '1'。

“[myPicker selectedRowInComponent:2]”将从组件“2”中的myPicker返回当前选择的原始no。 您可以通过

从component2中检索所选对象
 [component2Array objectAtIndex:[myPicker selectedRowInComponent:2]];

希望它适合你。

答案 6 :(得分:0)

这可能是" hack,"但它的确有效。我的情况略有不同。我使用了一个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]) {
            ...
        }
    }

我不确定它在Apple方面是如何运作的,但这足以让它对我有用。

作为旁注,我不确定这是否重要,但我的UIPicker位于UITableViewCell但是因为它是一个可重复使用的单元格而且因为我遇到的问题是我是,我认为UIPicker从一个位置移动到另一个位置时是相同的(因为一次只有一个位置)。

答案 7 :(得分:0)

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
}