自定义UIPickerView - 限制用户一次旋转一个轮子

时间:2012-04-17 20:13:09

标签: ios xcode uipickerview

我有一个自定义UIPickerView,其中三个组件相互依赖(即,第二个显示的值取决于在第一个中选择的内容,第三个依赖于第一个和第二个) 。我从UIPickerView中获取NSDictionary中显示的值。

一切都很好,除了当我同时旋转两个组件时,应用程序有时会崩溃(没时间重新加载数据)。这就是我pickerView:didSelectRow:inComponent的样子:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{
    NSLog(@"Selecting row %d component %d", row, component);

    // When A is changed, we need to reload B and C
    if (component == 0) {

        [pickerView reloadComponent:1];
        [pickerView selectRow:0 inComponent:1 animated:YES];

        // need to reload the C after reloading B
        [self pickerView:pickerView didSelectRow:0 inComponent:1];

    }
    else if (component == 1) {
        [pickerView reloadComponent:2];
        [pickerView selectRow:0 inComponent:2 animated:YES];
    }
    [self updateSelection];
}

有没有办法阻止用户一次旋转选取器的多个组件以防止崩溃?

谢谢!

2 个答案:

答案 0 :(得分:2)

善良的圣洁耶稣,你递归地呼唤didSelectRow:component:

我知道你处理参数的方式可以防止它超过两个级别,但是,不要这样做。如初。

无法阻止用户一次旋转多个组件。多点触控和iOS的乐趣在于将所有内容都设置为运动状态,并将其全部调整为一致的状态。并且由于微调器组件需要时间来稳定,因此用户可以仅使用一根手指将它们设置为全部。您必须学会相应地编写代码。

在这种情况下,您希望从内部删除对didSelectRow:component:的所有调用 - 它仅由系统调用。您使用reloadComponent:就走在了正确的轨道上,只是因为您没有重新加载它们:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSLog(@"Selecting row %d component %d", row, component);

    [self updateSelection];

    // When A is changed, we need to reload B and C
    if (component == 0) {
        [pickerView reloadComponent:1];
        [pickerView reloadComponent:2];
    } else if (component == 1) {
        [pickerView reloadComponent:2];
    }
}

我不知道您的updateSelection做了什么 - 可能是根据pickerView的值来设置数据模型。这很好 - 但它需要在您的方法的顶部发生,因此当您调用titleForRowviewForRow中的任何一个时,它都有适当的数据可供选择。此外,从这三个中的任何一个(updatetitleForviewFor)中, 将值置入选择器!请阅读它。

我认为这对你来说是一个很好的起点,但是当你接近目标时,你必须在这里和那里稍微调整一下。我认为你会发现Pickers的关键在于,只有当一个组件微调器的东西落在一个值上时,它们才会断言didSelectRow:component:,如果你重新加载它们,它们真的很好地继续旋转。试一试,看看你是否可以取得一些进展,如果你遇到困难就发回信息。

答案 1 :(得分:0)

一次旋转两个轮子意味着您启用了多点触控,对吧? 因此,有可能只是禁用多点触控并限制用户触摸并仅影响UIPickerView中的一个滚轮。

这是link可能会有所帮助。