动态 UIPickerView 竞争条件?
Posted
技术标签:
【中文标题】动态 UIPickerView 竞争条件?【英文标题】:dynamic UIPickerView race condition? 【发布时间】:2014-01-24 17:57:02 【问题描述】:我有一个两级 UIPickerView,这意味着如果用户选择第一个组件,第二个组件将更新其数据。
数据应该是这样的:
self.type = @[@"fruit", @"airlines"];
self.data = @[@[@"Apple", @"Orange"], @[@"Delta", @"United", @"American"]];
数据源和委托方法:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 2;
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
if(component == 0)
return self.data.count;
else if(component == 1)
NSInteger row1 = [pickerView selectedRowInComponent:0];
return [self.data[row1] count];
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
if(component == 0)
[pickerView reloadComponent:1];
NSInteger row1 = [pickerView selectedRowInComponent:0];
NSInteger row2 = [pickerView selectedRowInComponent:1];
// here may crash, some time
NSLog(@"data: %@", self.data[row1][row2]);
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
if(component == 0)
return self.type[row];
else if(component == 1)
NSInteger row1 = [pickerView selectedRowInComponent:0];
// here may also crash
return self.data[row1][row];
上述代码中有几个地方可能会导致崩溃(NSRangeException),如注释所示。然而,它们很少发生。我还没有遇到这种崩溃,但根据 Crashlytics 报告,我的用户遇到了。
我在访问 self.data[row1][row2] 之前添加了一些代码来验证 row1 和 row2,如果失败则发送到我的服务器。我发现 [pickerView selectedRowInComponent:0] 的值有时可能不正确。例如,当用户将第一个组件从“fruit”更改为“airlines”并选择第二个组件中的某个项目时,selectedRowInComponent:0 的值可能仍为 0(“fruit”的索引)。
我猜这是由竞争条件引起的,但我该如何解决呢?
【问题讨论】:
【参考方案1】:如果一个组件表示一个包含三个成员(航空公司)的数组并且该组件中的选定行是最后一个成员,然后您将组件翻转以表示两个成员数组(水果),它将崩溃。 pickerview 保留了这个变量 (selectedrowincomponent:x),现在想要在两个成员数组上表示成员 #2(只有成员 #0-1)-> NSRangeException。您需要先更改该组件中的 selectedRow,然后再使用 reload 将其翻转到不同的数组..
我个人不喜欢使用一个选择器来做两件事,恕我直言,这很麻烦,只是为每个编写一个不同的类作为委托/数据源,一个可以是另一个的子类,然后根据需要延迟加载 em
p>【讨论】:
实际上我是在进行两级类别选择。 我刚刚用这里的解决方案解决了这个问题:***.com/questions/18544600/… 不过,非常感谢。 :) 很高兴您有解决方案。我的答案实际上是对同一个答案的不那么冗长的重复仅供参考,如何接受:)以上是关于动态 UIPickerView 竞争条件?的主要内容,如果未能解决你的问题,请参考以下文章
触摸 UITextField 时设置 UIPickerView 的默认值
如何在 UIPickerView 上添加 UIToolbar? (iPhone/iPad)