动态 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)

如何动态锁定线程并避免竞争条件

如何在 Redux 应用程序中动态/任意创建额外的 reducer 或避免获取竞争条件

UIPickerView - 条件显示

动态显示/隐藏使用界面生成器创建的 UIPickerView