2017-04-15 3 views
3

Fondamentalement, ce que j'essaie de faire est de passer un nombre entier d'un contrôleur d'interface. Le curseur dans le contrôleur "SecondPage" obtiendra une valeur entière du curseur et devrait l'envoyer au contrôleur d'interface appelé "ThirdPage" et mettre le titre de cette étiquette à la valeur. J'ai essayé tant de méthodes mais en vain. J'essaye juste d'envoyer le contexte du 2ème contrôleur d'interface, le reçois dans la méthode éveillée (avec Contexte Contexte: Tout?) Dans le 3ème contrôleur et l'enregistre comme titre jusqu'à ce que le curseur soit changé encore.Pourquoi ne puis-je pas envoyer de données entre les contrôleurs d'interface pour Apple Watch?

Voici ce que j'ai essayé d'abord dans le deuxième contrôleur de page, mais il ne passe pas toutes les données:

override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? { 
if segueIdentifier == "ThirdPage"{ 
    return sliderval 
} 
return nil 
} 

voici ce que j'ai essayé après cela, il a passé les données, mais il n'a pas « sauver » il. Il affiche le contrôleur d'interface avec l'étiquette mise à jour à la valeur du curseur, mais je ne veux pas qu'il apparaisse, je veux que cette valeur soit enregistrée sur l'étiquette. Quand je ferme la pop, et glisser vers la droite à la troisième page, l'étiquette est encore appelée « Étiquette »

self.presentController(withName: "ThirdPage", context: sliderval) 

Voici quelques photos de la sortie ainsi que certains de mon code. Toute aide est appréciée, merci. PS: Ceci est tout à Swift 3 enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Répondre

1

Vous utilisez une navigation basée sur des pages et vous devez transmettre des données entre les pages. Ce que je voudrais faire est d'enregistrer les données du curseur quelque part que la troisième page peut accéder, et remplir les données dans l'étiquette willActivate. La méthode willActivate doit être appelée par le système lorsque l'utilisateur passe d'une page à l'autre. À l'échelle globale, créez une variable pour contenir la valeur du curseur.

var sliderValue: Float = 0 

Dans votre deuxième contrôleur d'interface, définissez cette valeur lorsque le curseur change.

@IBAction func sliderChanged(_ value: Float) { 
    sliderValue = value 
} 

Dans votre troisième contrôleur d'interface, lorsque la page est sur le point d'apparaître, définissez l'étiquette sur la valeur correcte.

override func willActivate() { 
    label.setText("\(sliderValue)") 
} 

Si vous voulez éviter l'utilisation de variables globales que vous pouvez lire et écrire des valeurs par défaut de l'utilisateur, ou utiliser d'autres tactiques, mais cela dépendra des besoins exacts de votre application.

+0

parfait, en utilisant une variable globale a bien fonctionné. Je vous remercie! Comme vous l'avez mentionné à propos de l'évitement des variables globales, pourriez-vous en expliquer les inconvénients? Serait-il plus difficile de soumettre une application en utilisant des variables globales, ou est-ce que la validation de la variable est vérifiée pour s'assurer qu'elle n'est pas nulle en la déballant? Merci –

+0

Les variables globales sont généralement considérées comme une mauvaise pratique car il est plus difficile de maintenir le logiciel. Quand un objet peut changer sa valeur, il est vraiment facile d'introduire des bogues dans votre programme. Il est également difficile de déterminer quels objets lisent et écrivent cette valeur à partir du code lui-même, il peut donc être plus difficile à maintenir à long terme. – nathan

+0

bon point, cela semble similaire à lire l'ancienne valeur d'un registre alors qu'une nouvelle valeur est en cours d'écriture. Merci pour la réponse rapide! –

1

Votre problème pop-up indésirable se produit parce que vous appelez presentController() dans sliderChanged(). Chaque fois que le curseur change, vous lui dites d'afficher le contrôleur "ThirdPage". Vous pouvez simplement supprimer cela.

Modifier: Ma réponse a incorrectement supposé que le demandeur travaille avec la navigation hiérarchique. Pour la navigation basée sur des pages, il n'y a apparemment aucun moyen de transmettre des données d'une page à l'autre, vous êtes donc bloqué avec l'utilisation d'un global comme le suggère la réponse acceptée. La réponse originale suit:

En ce qui concerne l'absence de contexte de passage, je suppose que vous n'avez probablement pas l'identificateur de segue défini dans Interface Builder, ou qu'il est défini sur autre chose que «ThirdPage». Le segue est séparé du contrôleur "ThirdPage", et vous devez définir son identifiant séparément. Cliquez sur le cercle au milieu de la flèche de la segue et jetez-y un coup d'œil dans l'inspecteur des attributs.

En supposant que j'ai raison à ce sujet, le problème est que contextForSegueWithIdentifier() est appelé avec un identifiant que vous n'attendez pas. Comme ce n'est pas "ThirdPage", le conditionnel échoue et il retourne zéro. La définition de l'identifiant du segue devrait le réparer.

+0

Merci pour la réponse, je vais essayer aussi! –

+1

@johnrowland J'espère que cela fonctionne pour vous! La réponse acceptée (en utilisant une variable globale) fonctionnera dans ce cas, mais pour un projet plus compliqué, vous voudrez certainement savoir comment transmettre des données directement entre les contrôleurs. – Robert

+0

Je suis d'accord @Robert que ce serait une bonne pratique à apprendre. Je l'ai essayé, mais je pense que je suis un peu confus sur l'endroit où je mettrais l'identifiant Segue. J'ai ajouté 3 images à ma question, si possible, pourriez-vous jeter un coup d'œil et me guider sur l'endroit où je trouverais l'identifiant Segue et tout autre changement que je devrais faire? L'identificateur Segue est-il différent de l'identificateur du contrôleur d'interface tel que vu dans la première nouvelle image? Dans ce cas, contextForSegueWithIdentifier() renvoie probablement la valeur incorrecte si j'essaie de rechercher l'identificateur "ThirdPage". –