2009-03-31 1 views
2

Ich habe eine UIPickerView und ich möchte benachrichtigt werden, wenn die selectRow Animation fertig ist.Wie bekomme ich einen Rückruf von UIPickerView, wenn die selectRow Animation fertig ist?

ich den folgenden Ansatz in meiner Ansicht-Controller versucht, die einen Verweis auf die UIPickerView hat und es wird nicht funktionieren:

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

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

    } 

} 

Dann irgendwo in meinem Code, initiieren ich die Animation:

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

Antwort

2

Sie müssen den Methodenaufruf in einen beginAnimations/commitAnimation-Block verschachteln.

- (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

das funktioniert nicht, zumindest in iOS8 – jomafer

1

Sie eine Benachrichtigung an sich selbst von viewForRow schreiben könnte, wenn es Ansicht für Komponente & Reihe fragt Sie interessiert sind.

Sie müssen nur Zeile & Komponente als Eigenschaften halten und setzen Sie sie, bevor Sie selectRow aufrufen. Und in viewForRow

if ((Komponente == [self-Komponente] & & (Zeile == [self Zeile]) Post eine Benachrichtigung an Selbst

1

Ich löste es mit einem Mix aus verschiedenen Antworten erwähnt das Verhalten wird hier. sein, dass es bis zum Scrollen beendet warten und dann den gewählten Wert speichern.

  1. zwei Variablen erstellen, die den Scroll-Zustand speichern und das sollte Zustand speichern. im didSet werden Sie überprüfen, Wenn die Taste "Speichern" gedrückt wurde, während die Auswahl durchläuft Ing. Wenn ja, rufen Sie den Speichervorgang auf, nachdem die Auswahl beendet wurde.

    var shouldSave = false 
    var pickerViewIsScrolling = false { 
        didSet { 
         if !pickerViewIsScrolling && shouldSave { 
          save() 
         } 
        } 
    } 
    
  2. Um zu erkennen, ob der Kommissionierer, fügen pickerViewIsScrolling = true im viewForRow Methode des Picker-Scrolling.

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { 
        pickerViewIsScrolling = true 
        ... 
    } 
    
  3. Um zu erkennen, ob der Kommissionierer pickerViewIsScrolling = false zum didSelectRow des Pickers Scrollen gestoppt hinzufügen.

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
        pickerViewIsScrolling = false 
        ... 
    } 
    
  4. In Ihrer save() Funktion fügen Sie folgendes ob der Kommissionierer zu überprüfen, wird das Scrollen (und speichern, nachdem er gestoppt) oder Scrollen nicht direkt speichern.

    func save() { 
        if(pickerViewIsScrolling){ 
          shouldSave = true 
          return 
        } 
    
        // Save the Data... 
    
    } 
    
  5. Und schließlich Ihre viewDidAppear Funktion diese Zeile hinzufügen, die pickerViewIsScrolling = true der ersten erzeugten Ansichten zu fangen.

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

Dies funktioniert gut für mich. Ich habe auch die Deaktivierung der Schaltfläche implementiert, während die Sicherung gedrückt wurde und auf das Scrollen wartet. So wird der Benutzer nicht verwirrt, warum nichts passiert, bis das Scrollen aufhört.