7
votes

Arrêtez par programme l'animation Uipickerview sur iPhone

J'ai une feuille d'uction contenant un sélecteur et une uitoolbar. Sur l'UITOOLBAR, il y a un bouton d'enregistrement. Cependant, certains de mes utilisateurs ont signalé avoir appuyé sur le bouton Enregistrer avant que UIIPICKERVIEW ne cesse de filer ne récupérant ainsi que la valeur initiale (avant la filature).

Y a-t-il un moyen d'obtenir l'élément actuellement sélectionné de l'UIIIPICKERView une fois que l'utilisateur tape de sauvegarde ou obtenez des commentaires de l'élément sélectionné actif alors qu'il fait tourner?

merci


4 commentaires

Que voulez-vous dire sous la filature? Le seul élément de filature de l'iPhone UI que je connais est UiactivitéIndicatorview


Je n'ai pas essayé mais ce qui se passe si vous faites cela en tournant? [Picker SelectRow: [Picker sélectionnéRowincomponent: i] Incomponent: i Animation: Oui]; Pour chaque composant i vous avez?


@Max sur iPhone, vous pouvez balayer sur l'uipickerview pour le faire tourner (style de machine à sous)


@ Nacho4d ... J'ai répondu à la même chose ... Vous auriez dû répondre au lieu de commenter ... cela aurait aussi gagner du temps aux autres ..


8 Réponses :


0
votes

sur le bouton "Enregistrer" Cliquez sur, vous pouvez récupérer l'objet sélectionné de votre composant par xxx

où,

  • "composant1array" est un nsarray ou NsmutableArray, objet qui utilisait Afficher les objets (contenus bruts) dans votre composant.
  • "myPicker" est un objet uipickerview qui affiche le cueilleur.
  • "[myPicker sélectionnéRowincomponent: 1]" retournera la sélection actuelle RAW NO DE LA MYPICKER IN COMPOSANT '1'.

    et "[MyPicker Sellement sélectionnéRowincomponent: 2]" Retournera le numéro brut actuellement sélectionné du myPicker dans le composant "2". Vous pouvez récupérer l'objet sélectionné de votre composant2 par xxx

    espoir que cela fonctionne pour vous.


1 commentaires

Le problème est que lorsque le bouton Enregistrer est cliqué, si la vue de sélection est toujours en train de tourner, la ligne sélectionnée n'a pas encore été définie. Cela ramenera toujours toujours la ligne précédemment sélectionnée, et non celle de la ligne de la mise en évidence de la sélection, ne répartissez pas le problème. Le problème est de savoir comment on dit à la force à la vue de la sélection de sélectionner la ligne qu'il semble être activée pendant une rotation. Je ne pense pas que tu peux.



1
votes

Je ne pense pas que ce soit un problème que vous allez pouvoir résoudre avec uipickerview par lui-même.

Il n'y a aucun moyen de désormais que la ligne est sélectionnée sans l'arrêt d'animation (et donc la vue de la sélection en sélectionnant la ligne à laquelle elle s'est arrêtée). Le seul moyen serait de dire au cueilleur que la ligne d'arrêt à l'arrêt, en utilisant le SelectRow: Incomponent: animé: Mais comment saurez-vous quelle ligne qui est? Vous ne savez pas parce que le cueilleur est filant ...

Je pense que ce n'est qu'une limitation du uipickerview et Apple le décrirait probablement comme un comportement attendu.


1 commentaires

Vous pouvez obtenir une ligne actuelle à l'aide de la méthode de SeleyRow Incomponent de PickerView, même Uipickerview est en train de tourner.



2
votes

Avez-vous déjà pensé à utiliser la méthode titlefornor pour la comprendre. Comme le défilement pickerview est le défilement, votre Titrefornor est appelé pour remplir les lignes ci-dessus ou sous la ligne actuellement visualisée (en fonction de la manière dont le sélecteur est en train de tourner). Lorsque le sélecteur s'arrête, la méthode DIDSelectrow est appelée et la ligne renvoyée est 2 lignes de la dernière ligne remplie dans la méthode (code>.

Je penserais que vous pouvez choisir d'arrêter le sélecteur à un moment donné (minuteries pour détecter le point utilisé pour raconter le code dans Titrefornor pour capturer le composant et la ligne de l'appel) dans le défilement et Ensuite, faites un selectrow pour définir la valeur sur ce que vous voulez que ce soit après cela, il arrête de filer (et DisSelectrow est appelé).


0 commentaires

5
votes

Même s'ils renvoient le cueilleur alors qu'il fait toujours tourner, le sélecteur appellera toujours le délégué avec la dernière ligne sélectionnée une fois qu'elle s'arrête, même si ce n'est pas visible. En supposant que vous ne l'avez pas encore traité, vous pouvez définir le récepteur délégué pour vérifier si le cueilleur est visible et si ce n'est pas le cas, enregistrez la valeur sélectionnée.

Je fais cela en supposant qu'il est clair que l'utilisateur ne défile pas à une valeur aléatoire - généralement lorsqu'ils font défiler et licencier sans attendre qu'il s'installe, cela signifie qu'ils sont défilés vers le haut ou le très bas de la liste. Je dirais que vous pouvez utiliser en toute sécurité le résultat du délégué dans ces deux cas.


2 commentaires

Vous êtes la réponse la plus proche jusqu'à présent! Il semblerait que c'est une solution valide. Cependant, mon sélecteur est dans une feuille d'utilisation, il sera donc libéré après avoir frappé un bouton de la barre d'outils sur la feuille d'outils qui est très susceptible de se produire en tournant car il n'y a pas beaucoup de lignes. Toute suggestion pour savoir comment travailler autour de ceci ou faire cesser de manière programmée? Votez néanmoins


Merci beaucoup Shaun, me frappant un peu pour ne pas penser à cela en premier lieu mais m'a totalement aidé !! Merci encore!



1
votes

J'ai eu le même problème ... Je l'ai réparé en ajoutant simplement la ligne de code suivante sur la méthode qui ferme ou sélectionne la valeur de cueillette. xxx


0 commentaires

1
votes

Vient de trouver une solution, ce qui fonctionne pour mon cas. Je n'ai pas besoin de ce dernier événement de mise à jour, généré lorsque le sélecteur arrête de tourner après l'utilisateur le rejeté. Donc, cette méthode empêche le défilement et ne provoque pas de nouveaux événements de sélection de mise à jour. On dirait que vous allez vérifier si les sélections sont correctes dans le sélecteur après ceci (je m'en fiche, je resélectionne des valeurs lorsque je montre le sélecteur).

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

0
votes

Cela pourrait être un "hack", mais cela fonctionne. Mon cas est légèrement différent. J'utilise un uipicker code>, mais peut changer quel objet c'est la manipulation.

Mon problème était que vous pouvez sélectionner un objet, tourner le sélecteur et pendant que cela se termine, Sélectionnez un autre objet. Ce qui a fini par arriver, c'était le nouvel objet obtenait la valeur finale de ce tour, plutôt que d'être ignoré. P>

Qu'est-ce que j'ai fait quoi lors de la configuration du code> UIPICK CODE> il est une balise unique > basée sur l'objet qu'il était censé mettre à jour. p> xxx pré>

puis quand il finit sa rotation, je vérifie que je vérifie que Tag Lignes Up Toujours. P>

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


0 commentaires

-2
votes
var isSpinning  = false (Global)

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
  self.isSpinning = true
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  self.isSpinning = false
}

0 commentaires