2009-03-31 6 views
2

J'ai un UIPickerView et je voudrais être averti quand l'animation de selectRow est faite.Comment obtenir le rappel depuis UIPickerView lorsque l'animation selectRow est terminée?

J'ai essayé l'approche suivante dans mon contrôleur de vue qui a une référence à la UIPickerView et il ne fonctionnera pas:

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

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

    } 

} 

Ensuite, quelque part dans mon code, je lance l'animation:

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

Répondre

2

vous devez imbriquer l'appel de méthode dans un bloc beginAnimations/commitAnimation. vous

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

cela ne fonctionne pas, au moins dans iOS8 – jomafer

1

pourrait poster une notification à l'auto de viewForRow quand il demande vue pour le composant & ligne qui vous intéresse.

Vous devez simplement maintenir le composant & de la ligne en tant que propriétés et les définir avant d'appeler selectRow. Et, dans viewForRow

if ((composante == [composante auto] & & (ligne == [rangée auto]) afficher une notification à l'auto

1

Je l'ai résolu avec un mélange de différentes réponses mentionnées ici. le comportement sera qu'il attendra jusqu'à ce que le défilement terminé et puis enregistrez la valeur sélectionnée.

  1. Créer deux variables, qui stockent l'état de défilement et devrait enregistrer l'état. Dans le didSet vous vérifierez, si le bouton de sauvegarde a été pressé pendant que le sélecteur fait défiler ing. Si oui, appelez save après que le sélecteur a fini de défiler.

    var shouldSave = false 
    var pickerViewIsScrolling = false { 
        didSet { 
         if !pickerViewIsScrolling && shouldSave { 
          save() 
         } 
        } 
    } 
    
  2. Reconnaître si le sélecteur défile, ajoutez pickerViewIsScrolling = true dans la méthode viewForRow du sélecteur.

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { 
        pickerViewIsScrolling = true 
        ... 
    } 
    
  3. Reconnaître si le sélecteur a cessé de défilement ajouter pickerViewIsScrolling = false à la didSelectRow du sélecteur.

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
        pickerViewIsScrolling = false 
        ... 
    } 
    
  4. Dans votre fonction save() ajouter ce qui suit pour vérifier wether le sélecteur est défilement (et sauvegarde après l'arrêt) ou ne défile pas et enregistrer directement.

    func save() { 
        if(pickerViewIsScrolling){ 
          shouldSave = true 
          return 
        } 
    
        // Save the Data... 
    
    } 
    
  5. Et enfin ajouter à votre fonction viewDidAppear cette ligne pour attraper le pickerViewIsScrolling = true des vues générées initiales.

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

Cela fonctionne bien pour moi. J'ai également mis en œuvre la désactivation du bouton pendant que la sauvegarde a été pressée et il attend que le défilement se termine. Donc, l'utilisateur ne sera pas confus pourquoi rien ne se passe jusqu'à ce que le défilement s'arrête.