我有一个自定义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];
}
有没有办法阻止用户一次旋转选取器的多个组件以防止崩溃?
谢谢!
答案 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
的值来设置数据模型。这很好 - 但它需要在您的方法的顶部发生,因此当您调用titleForRow
或viewForRow
中的任何一个时,它都有适当的数据可供选择。此外,从这三个中的任何一个(update
,titleFor
,viewFor
)中, 不 将值置入选择器!请阅读它。
我认为这对你来说是一个很好的起点,但是当你接近目标时,你必须在这里和那里稍微调整一下。我认为你会发现Pickers的关键在于,只有当一个组件微调器的东西落在一个值上时,它们才会断言didSelectRow:component:
,如果你重新加载它们,它们真的很好地继续旋转。试一试,看看你是否可以取得一些进展,如果你遇到困难就发回信息。
答案 1 :(得分:0)
一次旋转两个轮子意味着您启用了多点触控,对吧? 因此,有可能只是禁用多点触控并限制用户触摸并仅影响UIPickerView中的一个滚轮。
这是link可能会有所帮助。