0

我有一個兩級UIPickerView,這意味着如果用戶選擇第一個組件,第二個組件將更新其數據。動態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」的索引)。

我想這是由競態條件引起的,但我該如何解決這個問題?

回答

0

如果一個組件代表一個包含三個成員(航空公司)的數組,並且該組件中選定的行是最後一個成員,然後您將該組件翻轉以表示兩個成員數組(水果),它將會崩潰。 pickerview保留了這個變量(selectedrowincomponent:x),現在想要在兩個成員數組(僅包含成員#0-1) - > NSRangeException上表示成員#2。你需要改變該組件中的selectedRow,然後將其重新加載到不同的陣列中。

我個人不喜歡用一個選擇器來做兩件事,它很凌亂恕我直言,只是寫一個不同的類來委託/ dataSource爲每個,一個可以是另一個的子類,然後根據需要延遲加載EM

+0

實際上,我正在進行兩個級別的類別選擇。 – benck

+0

我剛剛用這裏的解決方案解決了這個問題:http://stackoverflow.com/questions/18544600/uipickerview-crashes-app-when-user-is-spinning-components-at-the-same-time然而,謝謝你非常。 :) – benck

+0

我很高興你有一個解決方案。我的答案其實是一個不太詳細的重複相同的答案僅供參考,如何回合:) – Jef