J'ai de nombreuses annotations dans une carte (avec des rightCalloutAccessory
boutons). Le bouton effectuera un enchaînement de ceci mapview
à a tableview
. Je veux passer tableview
un objet différent (qui contient des données) en fonction du bouton de légende sur lequel vous avez cliqué.
Par exemple: (totalement composé)
- annotation1 (Austin) -> passer les données obj 1 (pertinentes pour Austin)
- annotation2 (Dallas) -> passer les données obj 2 (pertinentes pour Dallas)
- annotation3 (Houston) -> passer les données obj 3 et ainsi de suite ... (vous avez l'idée)
Je peux détecter le bouton de légende sur lequel vous avez cliqué.
J'utilise prepareForSegue
: pour passer les données obj à la destination ViewController
. Étant donné que je ne peux pas faire de cet appel un argument supplémentaire pour l'obj de données dont j'ai besoin, quelles sont les façons élégantes d'obtenir le même effet (obj de données dynamiques)?
Tout conseil serait apprécié.
ios
xcode
uitableview
mapkit
storyboard
grésiller
la source
la source
Réponses:
Saisissez simplement une référence au contrôleur de vue cible dans la
prepareForSegue:
méthode et passez-y tous les objets dont vous avez besoin. Voici un exemple ...RÉVISION: Vous pouvez également utiliser la
performSegueWithIdentifier:sender:
méthode pour activer la transition vers une nouvelle vue en fonction d'une sélection ou d'une pression sur un bouton.Par exemple, considérez que j'avais deux contrôleurs de vue. Le premier contient trois boutons et le second doit savoir lequel de ces boutons a été enfoncé avant la transition. Vous pouvez câbler les boutons jusqu'à un
IBAction
dans votre code qui utilise uneperformSegueWithIdentifier:
méthode, comme celle-ci ...EDIT: L'application de démonstration que j'ai jointe à l'origine a maintenant six ans, donc je l'ai supprimée pour éviter toute confusion.
la source
[vc setMyObjectHere:object];
cela dynamiquement. ie obj1 pour button1, obj2 pour button2 Le problème est que je ne peux pas passer d'argument. Y a-t-il un moyen de contourner cela?Il est parfois utile d'éviter de créer une dépendance au moment de la compilation entre deux contrôleurs de vue. Voici comment vous pouvez le faire sans vous soucier du type de contrôleur de vue de destination:
Donc, tant que votre contrôleur de vue de destination déclare une propriété publique, par exemple:
vous pouvez définir cette propriété dans le contrôleur de vue précédent comme je l'ai décrit ci-dessus.
la source
setMyData:
. C'est une dépendance. Le fait que vous utilisiez un sélecteur pour éviter l'erreur de compilation doit être traité comme une faiblesse de votre approche et non comme un avantage. Je suis choqué par le nombre de développeurs qui ont perdu le concept selon lequel les erreurs de compilation devraient être préférées aux erreurs d'exécution.Dans Swift 4.2, je ferais quelque chose comme ça:
la source
J'ai une classe d'expéditeur , comme celle-ci
J'utilise cette classe d'expéditeur pour passer des objets à
prepareForSeque:sender:
la source
prepareForSegue
ou nous appliquons et l'hypothèse est prepareForSegue est appelée elle - même à dire que nous ne devons faire quelque chose comme[self prepareForSegue]
Je suis tombé sur cette question lorsque j'essayais d'apprendre à transmettre des données d'un View Controller à un autre. J'ai besoin de quelque chose de visuel pour m'aider à apprendre, donc cette réponse est un complément aux autres déjà présentes. Elle est un peu plus générale que la question d'origine mais elle peut être adaptée au travail.
Cet exemple de base fonctionne comme ceci:
L'idée est de passer une chaîne du champ de texte du First View Controller à l'étiquette du Second View Controller.
Contrôleur First View
Second View Controller
Se souvenir de
UITextField
et leUILabel
.La source
Comment envoyer des données via Segue (Swift) (tutoriel YouTube)
Voir également
Contrôleurs de vue: transmission de données vers l'avant et transmission de données (réponse plus complète)
la source
Pour Swift, utilisez ceci,
la source
J'ai implémenté une bibliothèque avec une catégorie sur UIViewController qui simplifie cette opération. Fondamentalement, vous définissez les paramètres que vous souhaitez passer dans un NSDictionary associé à l'élément d'interface utilisateur qui effectue la transition. Cela fonctionne également avec les séquences manuelles.
Par exemple, vous pouvez faire
pour une séquence manuelle ou créez un bouton avec une séquence et utilisez
Si le contrôleur de vue de destination n'est pas conforme au codage de valeur-clé pour une clé, rien ne se produit. Il fonctionne également avec les valeurs-clés (utile pour les séquences de déroulement). Découvrez-le ici https://github.com/stefanomondino/SMQuickSegue
la source
Ma solution est similaire.
la source
Utilisez simplement cette fonction.
la source
J'ai utilisé cette solution afin de pouvoir conserver l'invocation de la séquence et la communication de données dans la même fonction:
Un cas d'utilisation serait quelque chose comme:
Cela semble fonctionner pour moi, cependant, je ne suis pas sûr à 100% que les fonctions performer et préparer sont toujours exécutées sur le même thread.
la source