2012-07-23 71 views
2

我對拾取器下面的代碼含有2個組分:uipickerview含有2種組分代表

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { 
if (component == 0) { 
    NSLog(@"first"); 
} 
else 
{ 
    NSLog(@"second"); 
} 
} 

問題當用戶嘗試滾動部件0的第一和等待它完全停止之前,然後滾動部件1與此同時。

然後我只會有「秒」的控制檯日誌。所以看起來第一個事件被第二個事件覆蓋了。

有沒有一種方法可以讓我們等待拾取器滾動事件自行完成?

謝謝。

+0

我沒有看到問題:如果用戶滾動組件0,並且不等待它完成滾動(並開始滾動組件1),那意味着他不需要選擇組件0。當組件0在停止前滾動時,將組件0設置爲它的初始位置。 – 2012-07-23 15:18:16

+0

你有2個組件,聲明2個整數,用零初始化它們。現在,在didSelectRow中相應地將這些整數設置爲組件中的選定行。在設置它們之後,以編程方式將pickerview滾動到這些整數中的行。所以如果一個組件沒有停止滾動,它會回滾。請注意不要進入這裏的無限循環(我擔心會發生) – 2012-07-23 15:22:24

+0

讓我們以默認的鬧鐘應用爲例,當用戶設置鬧鐘時,他可以同時撥打「小時」,然後「分鐘」組件,當點擊保存時,我們會得到正確的時間。但不幸的是我不能得到這種行爲:( – lucas 2012-07-23 15:23:37

回答

2

當試圖使雙組件UIPickerView正常工作時,我遇到了同樣的問題。正如有人建議的,不要使用if語句。

而是做到這一點:

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    self.valueA = [self.valuePickerView selectedRowInComponent:0]; 
    self.valueB = [self.valuePickerView selectedRowInComponent:1]; 

    self.valueLabel.text = [NSString stringWithFormat:@"%i:%i", self.valueA, self.valueB]; 
} 

當然,如果你正在尋找一個數組的元素,只要使用 「objectAtIndex:selectedRowInComponent:0」


DO NOT DO THIS:

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    if(component == 0){ 
     self.valueA = ...; 
    } 
    else if (component == 1){ 
     self.valueB = ...; 
    } 

    self.valueLabel.text = [NSString stringWithFormat:@"%i:%i", self.valueA, self.valueB]; 
} 

希望這可以幫助任何人爲此而努力。