Wie kommt man Rückruf von UIPickerView wenn die selectRow Animation getan wird?

StackOverflow https://stackoverflow.com/questions/703293

  •  22-08-2019
  •  | 
  •  

Frage

Ich habe eine UIPickerView und ich möchte benachrichtigt werden, wenn die selectRow Animation durchgeführt wird.

Ich habe versucht, den folgenden Ansatz in meinen Ansicht-Controller, 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];
War es hilfreich?

Lösung

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

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

Andere Tipps

Sie können eine Benachrichtigung an sich selbst von viewForRow schreiben wenn es Ansicht für die Komponente & Reihe fragen Sie daran interessiert sind.

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

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

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

  1. Erstellen Sie zwei Variablen, die den Scroll-Zustand speichern und das sollte Zustand speichern. Im didSet werden Sie überprüfen, ob die die Taste, während die Picker Scrollen gedrückt hat gespeichert worden. Wenn ja, rufen Sie speichern, nachdem der Kommissionierer Scrollen beendet ist.

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

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

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

    func save() {
         if(pickerViewIsScrolling){
              shouldSave = true
              return
         }
    
         // Save the Data...
    
    }
    
  5. Und schließlich Ihre viewDidAppear Funktion fügen Sie diese Zeile 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 implementierte auch die Deaktivierung der Taste während speichern gedrückt wurde und es wartet auf das Scrollen zu beenden. So wird der Benutzer nicht verwirrt, warum nichts passiert, bis das Scrollen stoppt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top