2011-01-30 72 views
7

我有一個包含選取器和UIToolbar的UIActionSheet。在UIToolBar上有一個保存按鈕。但是,我的一些用戶報告在UIPickerView停止旋轉之前按下保存按鈕,因此僅檢索初始值(在旋轉之前)。以編程方式停止iphone上的uipickerview動畫

有沒有一種方法,一旦用戶點擊保存或獲取活動所選項目的反饋,而它的旋轉,以獲得UIPickerView的當前選擇的項目?

感謝

+0

你是什麼意思在紡紗?我知道iPhone UI中唯一的旋轉元素是UIActivityIndi​​catorView – Max 2011-01-30 02:49:53

+0

我還沒有嘗試過,但是如果在旋轉時這麼做會發生什麼? `[picker selectRow:[picker selectedRowInComponent:i] inComponent:i animated:YES];`對於每個組件`i`你有? – nacho4d 2011-01-30 07:19:33

+0

@Max在iPhone上,你可以向下滑動uipickerview使其旋轉(老虎機風格) – zsniperx 2011-01-30 19:14:22

回答

0

「保存」 按鈕的點擊,您可以通過

[component1Array objectAtIndex:[myPicker selectedRowInComponent:1]]; 

其中檢索您的組件所選擇的對象,

  • 「component1Array」 是一個NSArray或 的NSMutableArray ,用於 的對象在您的組件中顯示 中的對象(原始內容)。
  • 「myPicker」是一個UIPickerView對象 ,其顯示了選擇器。
  • 「[myPicker selectedRowInComponent:1]」 將從組件 '1'中的myPicker返回當前選定的 原始編號。

而且「[myPicker selectedRowInComponent:2]」將從組件'2'中的myPicker返回當前選定的raw no。 您可以通過

[component2Array objectAtIndex:[myPicker selectedRowInComponent:2]]; 

檢索您的COMPONENT2所選對象希望它爲你工作。

1

我不認爲這是你要能夠通過自身與UIPickerView解決的一個問題。

沒有到現在沒有動畫停止選擇哪一行的方式(並且因此選擇它停止在該行選擇器視圖)。唯一的辦法是通過使用selectRow:inComponent:animated:來告訴選擇器哪一行停止,但是你怎麼知道哪一行是?你不知道,因爲機械手在旋轉......

我認爲這僅僅是UIPickerView的限制和蘋果很可能將其描述爲預期的行爲。

2

你有沒有想過使用titleForRow方法摸不着頭腦。當pickerview正在滾動時,將調用titleForRow方法來填充當前查看行的上方或下方的行(取決於拾取器旋轉的方式)。當選取器停止時,將調用didSelectRow方法,並且返回的行是titleForRow方法中填充的最後一行的2行。

我認爲你可以在滾動時選擇在某個點停止選擇器(定時器檢測點,用於通知titleForRow中的代碼捕獲組件和行),然後執行selectRow設置在停止旋轉之後它的值就是你想要的值(並調用didSelectRow)。

4

即使他們在仍在旋轉時關閉選取器,選取器仍然會在最終選定行停止時調用該委託,即使它不可見。假設您還沒有取消分配它,您可以設置代理接收器來檢查選擇器是否可見,如果不是,請保存選定的值。

我這樣做是假設用戶沒有滾動到一個隨機值 - 通常當他們滾動和解散而不等待它解決時,這意味着他們滾動到列表的最頂部或最底部。我想說你可以在這兩種情況下安全地使用委託的結果。

1

我有同樣的問題... 我通過在關閉或選擇選取器值的方法上簡單地添加下面的代碼行來修復它。

[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES]; 
1

剛發現的解決方案,適用於我的情況。我不需要最後一次更新事件,當用戶解散它時,選擇器停止旋轉時產生。所以這個方法停止滾動並且不會導致新的更新選擇事件。似乎你會在這之後檢查選擇器是否正常(我不在乎,當我顯示選擇器時我重新選擇了值)。

- (void)_resetPickerViewDelegates { 
    id delegate = [_pickerView.delegate retain]; 
    id dataSource = [_pickerView.dataSource retain]; 

    _pickerView.delegate = nil; 
    _pickerView.dataSource = nil; 
    [_pickerView reloadAllComponents]; 
    _pickerView.delegate = delegate; 
    _pickerView.dataSource = dataSource; 

    [delegate release]; 
    [dataSource release];  
} 
0

這可能是一個「黑客」,但它的工作原理。我的情況稍有不同。我正在使用一個UIPicker,但可以更改它正在操作的對象。

我的問題是,您可以選擇一個對象,旋轉選取器,並在它完成旋轉時,選擇一個不同的對象。最終發生的事情是新的目標是獲得這個自旋的最終價值,而不是被忽略。

我在設置UIPicker時做了什麼,我根據它應該更新的對象給它一個獨特的tag

- (void)updatePickerView:(UIPickerView*)pickerView 
{ 
    ... 
    pickerView.tag = [self.myObject.position integerValue]; 
    [pickerView selectRow:i inComponent:0 animated:NO]; 
} 

然後,當它完成其旋轉,我檢查,以確保標籤排列仍然。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
    { 
     if (pickerView.tag == [self.myObject.position integerValue]) { 
      ... 
     } 
    } 

我不知道它是如何在蘋果的一邊工作,但是這足以令它爲我工作。

作爲一個便箋,我不確定這是否重要,但我UIPicker是在UITableViewCell但由於它是一個可重用的單元格,因爲我遇到的問題,我假設UIPicker是當它從一個位置移動到另一個位置時一樣(因爲一次只有一個在屏幕上)。