2017-02-08 1 views
-1

Il y a plusieurs questions le long de ces lignes sur Stack Overflow, mais aucune ne semble répondre simplement à ma question spécifique. Je voudrais être en mesure de créer une étiquette sur un contrôleur de vue qui peut changer ce qu'il affiche en fonction de la valeur d'une étiquette sur un autre contrôleur de vue. J'utilise Xcode 8.2.1 et Swift 3.Accéder à IBOutlet à partir d'autres contrôleurs View

Modifier

FirstViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "showSecondViewController" { 

     if let viewController = segue.destination as? SecondViewController { 

      if messageLabel != nil { 

       SecondViewController.billString = self.messageLabel //error on this line 

      } 
     } 
    } 
} 

SecondViewController

@IBOutlet weak var billLabel: UILabel! 

var billString = "test" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    billLabel.text = billString 

} 
+0

Pouvez-vous être plus précis à ce sujet? Je suis sûr que vous pouvez le faire avec prepareForSegue, mais quand même ... vous devriez mettre un peu plus de contexte là-dessus. – i6x86

+0

@ i6x86 - Je suis un programmeur assez nouveau, donc je ne suis pas sûr combien d'informations je peux donner ... Il y a une étiquette sur le second contrôleur de vue que je veux changer la valeur de basé sur le valeur d'une étiquette sur le premier contrôleur de vue. – AEquinox01

+0

Quel type de données affichez-vous sur cette étiquette, est-ce une chaîne ou un int? – i6x86

Répondre

0

Voici une implémentation j'ai pu marteler sur un Aire de jeux super rapide. L'idée est que vous créez un protocole et sous-classe UILabel et remplacez sa propriété text par un didSet qui appelle la méthode de protocole.

class Label:UILabel { 
    var delegate:LabelDelegate? 

    override var text: String? { 
     didSet { 
      if let text = text { 
       self.delegate?.valueChanged(string: text) 
      } 
     } 
    } 
} 

protocol delegate:LabelDelegate { 
    func valueChanged(string:String) 
} 

class ViewControllerA:UIViewController { 
    IBOutlet weak var label:Label! 
} 

class ViewControllerB:UIViewController, LabelDelegate { 
    IBOutlet weak var label:UILabel! 

    func viewDidLoad() { 
     let a = A() // This is where you whould get a reference to ViewControllerA. Maybe using storyboardID or some other way 
     a.label.delegate = self 
    } 

    internal func valueChanged(string: String) { 
     //Check what the string variable is and set your label accordingly 
     self.label.text = "Hello World" 
    } 
} 

b.label contient maintenant le texte « Bonjour tout le monde »

Vous pouvez adapter cela à une implémentation UIViewController utilisant storyboardIDs ou d'une certaine façon de garder une trace des ViewControllers et en supposant que vous connaissez l'état nul de votre UIViewController, vous pouvez définir le délégué correctement.

+0

Merci pour l'aide. Je suis un programmeur assez nouveau - où devrais-je mettre ce code dans mon contrôleur de vue. Sous viewDidLoad? Aussi - Je ne veux pas que les étiquettes aient une valeur égale mais je veux que la première affecte la seconde. @Prientus – AEquinox01

+0

@ AEquinox01 Eh bien, je mettrais la sous-classe UILabel et le protocole dans un nouveau fichier.Ensuite, dans le storyboard, je donnais à l'étiquette ma classe personnalisée dans l'onglet Inspecteur d'identité sur la droite. Puis créez la sortie d'étiquette dans ViewControllerA afin qu'elle reconnaisse sa classe "Label" et ensuite je mettrais le délégué 'self.mylabel.delegate' dans viewDidLoad, oui. Après cela, lorsque vous implémentez la méthode 'valueChanged' dans ViewControllerB, vous ne devez pas le définir au texte entrant. Vous pouvez le définir comme vous le souhaitez. – Prientus

+0

PS: J'ai mis à jour le code pour regarder plus pertinent pour le schéma ViewController – Prientus

0

Vous pouvez mettre en œuvre prepareForSegue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "yourSegueIDHere" { 
      if let viewController = segue.destination as? DestinationViewController { 
       if(theVarContainingTheStringYouWantToSend !=nil){ 
       DestinationViewController.newVarContainigString = self.theVarContainingTheStringYouWantToSend 
       } 
      } 
     } 
    } 

Vous créez newVarContainigString dans le DestinationViewController et donner le Segue le nom que vous voulez et le mettre où il est dit yourSegueIDHere et lorsque vous effectuez la Segue votre var dans le vc de destination avoir la valeur que vous lui envoyez. Je suis au téléphone à droite, donc je ne peux pas être sûr à 100% si ce code fonctionne, mais si vous avez des problèmes, vous pouvez demander.