我有一個兩級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」的索引)。
我想這是由競態條件引起的,但我該如何解決這個問題?
實際上,我正在進行兩個級別的類別選擇。 – benck
我剛剛用這裏的解決方案解決了這個問題:http://stackoverflow.com/questions/18544600/uipickerview-crashes-app-when-user-is-spinning-components-at-the-same-time然而,謝謝你非常。 :) – benck
我很高興你有一個解決方案。我的答案其實是一個不太詳細的重複相同的答案僅供參考,如何回合:) – Jef