0

我有一个自定义UIPickerView,其中包含三个相互依赖的组件(即,第二个显示值取决于第一个中选择的内容,第三个取决于第一个和第二个)。我得到的值显示UIPickerViewNSDictionary.

一切都很好,除了当我同时旋转两个组件时,应用程序有时会崩溃(没有时间重新加载数据)。这就是我的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];
}

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

谢谢!

4

2 回答 2

2

好圣洁的耶稣,你didSelectRow:component:递归地呼唤!

我知道你处理参数的方式会阻止它超过两个层次,但仍然不要那样做。曾经。

没有办法阻止用户一次旋转多个组件。多点触控和 iOS 的乐趣在于让一切都处于运动状态,并看着它全部稳定到一致的状态。而且由于微调器组件需要时间来解决,用户只需用一根手指就可以将它们全部设置为 atwitter。您必须学会相应地编写代码。

在这种情况下,您希望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. 这很好 - 但它需要发生在您的方法的顶部,以便当您调用titleForRoworviewForRow中的任何一个时,它都有适当的数据可供选择。此外,在这三个 ( update, titleFor, viewFor)中的任何一个中,都不会将值断言到选择器中!只是从中阅读。

我认为这对您来说是一个很好的起点,但是随着您越来越接近目标,您将不得不在这里和那里进行一些调整。我认为您会发现 Pickers 的关键在于,它们仅didSelectRow:component:在组件微调器中的一个事情确定为某个值时才断言,并且如果您重新加载它们,它们非常适合继续旋转。试一试,看看您是否可以取得一些进展,如果遇到困难,请回复。

于 2012-04-18T12:34:17.433 回答
0

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

这是一个可能有帮助的链接。

于 2012-04-17T20:25:12.427 回答