web-dev-qa-db-fra.com

Transmission de données depuis les contrôleurs de vue Xcode

Il y a quelques semaines, j'ai posé la question ceci et obtenu une explication très détaillée. J'aimerais maintenant transmettre les données au premier ViewController mais je reste bloqué en utilisant la même méthode. J'ai un modal du premier VC au deuxième, où je voudrais éditer un tableau de chaînes, qui sera montré sur la première vue. Donc, sur ma première vue, j'ai un tableau de données, qui doit être transmis au second afin que les champs d'édition affichent les informations actuelles, après quoi l'utilisateur doit pouvoir modifier le contenu du tableau et transmettre ces données au premier il est montré sur les étiquettes. J'utilise Swift.

Mon code:

(dans ViewController.Swift :) 

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
        let secondVC = segue.destinationViewController as SecondViewController
        secondVC.namesPlayers = self.namesPlayers
    }

(dans SecondViewController.Swift :)

override func viewDidLoad() {
    super.viewDidLoad()
    labelFirstPlayer.text = namenSpelers[0]
}

Je vous remercie

14
B_s

Vous devez utiliser un délégué. Voici un exemple d'utilisation d'un délégué dans Swift.

Sur votre premier ViewController, définissez votre délégué lorsque vous chargez le deuxième VC:

Par exemple, si vous utilisez l’éditeur de scénarimage:

var secondViewController = (segue.destinationViewController.visibleViewController as  MySecondViewControllerClass)
secondViewController.delegate = self

Écrivez un protocole et définissez une fonction pour vous écrire des valeurs

Par exemple, créez un fichier appelé "Protocol.Swift" et écrivez quelque chose comme ça:

protocol writeValueBackDelegate {
    func writeValueBack(value: String)
}

Ajouter la fonction à votre FirstViewController

func writeValueBack(value: String) {
   // Or any other function you need to transport data
}

Et à votre ViewControllerClass

class ViewController: UIViewController, writeValueBackDelegate

La ligne ci-dessus ne fonctionnera pas si vous n'avez pas implémenté toutes les méthodes de ViewController que vous avez définies dans votre fichier de protocole.

Accédez au contrôleur de deuxième vue et ajoutez le délégué ici:

class SecondViewController: ViewController {

    // Delegate for FirstViewController
    // Declare as weak to avoid memory cycles
    weak var delegate: writeValueBackDelegate?
}

Sur votre second contrôleur View, vous pouvez maintenant l'utiliser pour appeler la fonction dans le premier contrôleur View View et lui transmettre des données.

delegate?.writeValueBack("That is a value")
37
derdida

J'espère que ceci vous aidera 

C'est le deuxième contrôleur à partir duquel vous voulez renvoyer les données. SecondView.Swift  

@objc protocol returnDataProtocol {
    func returnStringData(myData: String)
 }




 class SecondView: UIViewController {


        weak var delegate: returnStringData?


        @IBAction func readyButtonPressed(sender: AnyObject) {

        // Do what you want here 

        delegate?.returnStringData("Euro/Dollar etc....")
         // this function is exist in first view controller 

        }
    }

Première vue ViewController firstView.Swift

class firstView: UIViewController, returnDataProtocol {
    // this function will call to second view. You can use here Push method, if you are using navigation controller. 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "mySegue" { // your identifier here
            let controller = segue.destinationViewController as! MyPopOverController
            controller.delegate = self
        }
    }

   // here you will get return value from second view controller class

    func returnStringData(myData: String){
          print(myData)
       }

}
0
RviOS

La réponse que je donne aux délégués me laisse perplexe, parce que cela me semble inutilement compliqué. Voici ce que j'ai fait pour afficher une boîte de dialogue Ajouter un joueur dans mon jeu de cartes et transmettre les résultats au contrôleur de vue appelant.

Ajouter un protocole de délégué (dans mon cas, dans mon fichier Extensions/Protocols)

protocol ReturnPlayerInfoDelegate {
   func returnPlayerInfo(playerName : String, playerType : Player.Type)
}

Ensuite, j'ai ajouté ma référence (en tant que classe var) au délégué dans le contrôleur de vue CALLED. Notez que cela n’a pas nécessité de sous-classer mon appelant, ni d’ajouter le protocole à mon View Controller appelé:

class AddPlayerViewController : UIViewController {
     static var delegate : ReturnPlayerInfoDelegate!

et a appelé le délégué dans mon gestionnaire de boutons Ok:

    @IBAction func onOK(sender: UIButton) {
      AddPlayerViewController.delegate.returnPlayerInfo(mPlayerName.text!, playerType: mPlayerTypeActual)
    dismissViewControllerAnimated(true, completion: nil)
}

Maintenant, j'ai implémenté le délégué dans CALLING ViewController:

class FiveKings : UIViewController, UIGestureRecognizerDelegate, UIPopoverPresentationControllerDelegate ,UITextViewDelegate , ReturnPlayerInfoDelegate {
...
    override func viewDidLoad() {
         super.viewDidLoad()

         AddPlayerViewController.delegate = self
...
    func returnPlayerInfo(playerName : String, playerType : Player.Type) {
        mGame.addPlayer(playerName, newPlayerClass: playerType, fKActivity: self)
}

Cela fonctionne très bien. Voyez-vous des problèmes avec ma mise en œuvre?

0
Opus1217