2009-03-31 6 views
2

私はUIPickerViewを持っており、selectRowアニメーションが完了したときに通知を受けたいと思います。selectRowアニメーションが完了したときにUIPickerViewからコールバックを取得する方法は?

IはUIPickerViewへの参照を持っており、それが動作しません私のビューコントローラに以下のアプローチを試みた:どこかに自分のコードに続い

-(void)viewDidLoad 
{ 
    ... 
    [UIPickerView setAnimationDelegate:self]; 
    [UIPickerView setAnimationDidStopSelector:@selector(animationFin ished:finished:context]; 
    ... 
} 

- (void)animationFinishedNSString *)animationID finishedBOOL)finished contextvoid *)context 
{ 
    if (finished) { 

    } 

} 

、Iは、アニメーションを開始する:

[picker selectRow:random() % pickerDataCount inComponent:0 animated:YES]; 

答えて

2

メソッド呼び出しをbeginAnimations/commitAnimationブロックにネストする必要があります。

- (void) animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context { 
    NSLog(@"Here I am"); 
} 


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 

    [UIView beginAnimations:@"1" context:nil]; // nil = dummy 
    [UIPickerView setAnimationDelegate:self]; 
    [UIPickerView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; 
    [myPickerView selectRow:0 inComponent:0 animated:YES]; // jump with any swipe in picker always to row=0 as dummy to initiate animation 
    [UIView commitAnimations]; 

    //...whatever comes in addition... 
} 
+0

少なくともiOS8ではこれが動作しません – jomafer

1

それはあなたが興味を持っているコンポーネント&行のビューを要求したとき、あなたはviewForRow から自己に通知を投稿することができます。

ローの&コンポーネントをプロパティ として保持し、selectRowを呼び出す前にそれらを設定するだけで済みます。そして、((成分== [自己成分] & &(行== [自己行]) 自己

1

への通知を転記場合viewForRow

にIが挙げ異なる回答のうちミックスでそれを解決しましたここに。行動は、それがスクロールし、完成するまで待ってから、選択された値を保存することになります。

  1. は、スクロール状態を保存し、状態を保存しなければならない2つの変数を作成します。didSetでは、あなたがチェックします、ピッカーがスクロールされているときに保存ボタンが押された場合ing。はいの場合は、ピッカーがスクロールを終了した後にsaveを呼び出します。

    var shouldSave = false 
    var pickerViewIsScrolling = false { 
        didSet { 
         if !pickerViewIsScrolling && shouldSave { 
          save() 
         } 
        } 
    } 
    
  2. ピッカーがスクロールしている場合、認識ピッカーのviewForRow方法でpickerViewIsScrolling = trueを追加します。

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { 
        pickerViewIsScrolling = true 
        ... 
    } 
    
  3. ピッカーピッカーのdidSelectRowpickerViewIsScrolling = falseを追加し、スクロールが停止しているかどうかを認識します。あなたのsave()機能で

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
        pickerViewIsScrolling = false 
        ... 
    } 
    
  4. ピッカー天気を確認するには、次を追加し、スクロール(そしてそれが停止した後、保存)、またはスクロールされず、直接保存されます。

    func save() { 
        if(pickerViewIsScrolling){ 
          shouldSave = true 
          return 
        } 
    
        // Save the Data... 
    
    } 
    
  5. そして最後に、最初の生成ビューのpickerViewIsScrolling = trueをキャッチするためにあなたのviewDidAppear機能に次の行を追加します。

    override func viewDidAppear(_ animated: Bool) { 
    
        super.viewDidAppear(animated) 
    
        pickerViewIsScrolling = false 
    
        ... 
    
    } 
    

これは私のために正常に動作します。私はまた、保存が押されている間にボタンの非アクティブ化を実装し、スクロールが完了するのを待っています。だから、スクロールが止まるまで何も起こっていないのはユーザーには分かりません。

関連する問題