2017-09-13 2 views
0

J'ai essayé de trouver des réponses à des questions similaires, mais je ne suis pas particulièrement expérimenté et j'ai eu du mal à les suivre, donc toute aide serait grandement appréciée! Ma situation est la suivante: quand j'appuie sur un bouton dans mon Parent ViewController, le code suivant est utilisé pour appeler un Child ViewController (en passant, l'enfant est en fait un TableViewController, mais il semble bien fonctionner "penser" c'est normal ViewController):Comment transférer des données entre les contrôleurs parent et enfant

controller = (storyboard?.instantiateViewController(withIdentifier: "People")) 
    addChildViewController(controller!) 
    controller?.view.frame = CGRect(x: 10, y: 200, width: 394, height: 300) 
    self.view.addSubview((controller?.view)!) 
    controller?.didMove(toParentViewController: self) 

ce que je voudrais alors est de transférer un tableau de la mère à l'enfant, où il sera utilisé comme données de l'tableView? Deuxièmement, lorsque je sélectionne une cellule de TableView de l'enfant, je voudrais que les informations pertinentes soient envoyées au parent et que l'enfant disparaisse.
Dans le cas où il est intéressant, j'ai réussi à fermer l'enfant dans des circonstances différentes (en cas de clic dans le parent alors que l'enfant est affiché) en utilisant les éléments suivants:

  controller?.willMove(toParentViewController: nil) 
      controller?.view.removeFromSuperview() 
      controller?.removeFromParentViewController() 

J'apprécierais vraiment des conseils , même si c'est un lien vers quelque chose qui pourrait aider!

+1

vous pouvez passer le tableau comme la façon dont vous transmettre les données entre les deux contrôleurs de vue. après la ligne 'addChildViewController (controller!)', vous pouvez juste ajouter 'controller.array = self.array'. et pour revenir, vous pouvez utiliser une méthode déléguée. – CoderFrom94

+0

Vous pouvez rendre la propriété dans l'instance 'parentsViewVontroller' et' parentsViewVontroller's' à 'childViewController' et transmettre la valeur à cette variable OU vous pouvez faire un délégué de' childViewController' et recevoir les événements OU vous pouvez utiliser les blocs. – TheTiger

Répondre

1

Vous pouvez passer la valeur de parent à enfant Controller comme celui-ci

controller = (storyboard?.instantiateViewController(withIdentifier: "People")) 
    addChildViewController(controller!) 
    controller?.view.frame = CGRect(x: 10, y: 200, width: 394, height: 300) 
    controller.tableDataSource = // Pass your required value to child controller 
    self.view.addSubview((controller?.view)!) 
    controller?.didMove(toParentViewController: self) 

Vous souhaitez transférer votre valeur de sélection pour contrôleur de vue des parents. A cet effet, votre ont un créer un délégué dans ChildController comme

@protocol ChildControllerDelegate : class { 
    func selectedValue(Value : String) 
} 

Après cela faire une variable de ce délégué ChildController comme celui-ci

weak var delegate : ChildControllerDelegate? 

et quand la méthode rowDidSelect ajouter le code suivant

if(delegate != nil) { 
    delegate.selectedValue(Value :"Your selected value") 
} 

Maintenant, lorsque vous allez afficher ChildController à partir de ParentController à ce moment-là, vous devez définir cet objet delegate sur ParentController l ike ce

controller = (storyboard?.instantiateViewController(withIdentifier: "People")) 
    addChildViewController(controller!) 
    controller?.view.frame = CGRect(x: 10, y: 200, width: 394, height: 300) 
    controller.delegate = self 
    self.view.addSubview((controller?.view)!) 
    controller?.didMove(toParentViewController: self) 

et après tout mettre en œuvre la méthode de délégué ParentController comme

func selectedValue(Value : String) { 
    // you select val 
} 
+0

Brillant, cela a parfaitement fonctionné, merci :) – jasperthedog

0

Vous pouvez:

  • Jetez le controller à la classe appropriée pour le contrôleur de vue de l'enfant (J'utilise ChildViewController ci-dessous, mais j'espère que vous avez un nom plus descriptif); et

  • Passez le tableau (que vous avez peut-être appelé people, mais utilisez les noms de tableau de ces deux contrôleurs de vues respectifs) du contrôleur de vue actuel (le parent) à ce nouveau contrôleur de vue enfant.

Ainsi:

let child = storyboard!.instantiateViewController(withIdentifier: "People") as! ChildViewController 
addChildViewController(child) 
child.people = people 
child.view.frame = ... 
view.addSubview(child.view) 
child.didMove(toParentViewController: self) 

Personnellement, je ne voudrais pas coder en dur l'enfant coordonne comme vous l'avez fait dans votre question initiale. Je définirais translatesAutoresizingMaskIntoConstraints à false, puis j'ajouterais les contraintes de début/de fin/haut/bas appropriées, mais c'est à vous de décider. C'était juste trop douloureux de voir des coordonnées codées en dur dans votre exemple.

+0

Merci pour le conseil! Était en train de faire fonctionner les choses d'abord, puis mettre l'autoresizing par la suite (très nouveau pour cela, donc j'imagine que ce n'est peut-être pas la bonne façon de faire les choses!) – jasperthedog

0

Essayez ceci.

Première méthode publique pour ajouter et supprimer childVC.

Pour Ajouter un enfantVC.

public class func openChildViewController(parentVC:UIViewController, with childVC:UIViewController){ 

     parentVC.addChildViewController(childVC) 
     childVC.view.frame = parentVC.view.frame 
     parentVC.view.addSubview(childVC.view) 
     parentVC.didMove(toParentViewController: childVC) 
    } 

Pour supprimer childVC.

public class func removeChildViewController(childVC:UIViewController){ 

     childVC.willMove(toParentViewController: nil) 
     childVC.view.removeFromSuperview() 
     childVC.removeFromParentViewController() 
    } 

Utilisez la méthode ci-dessus.

1.ParentVC.swift

class ParentVC: UIViewController , ChildVCDelegate { 

    var arrType = NSMutableArray() 

    //add ChildVC 
    @IBAction func btnAddChildVC(_ sender: UIButton) { 
     let ChildVC = self.storyboard?.instantiateViewController(withIdentifier: "ChildVC") as! ChildVC 
     PickerVC.arrPass = arrType //for data passing create any object in ChildVC for ex. arrPass is NSMutableArray 
     ChildVC.delegate = self 
     openChildViewController(parentVC: self, with: ChildVC) 
    } 

    // MARK: ChildVC Delegate 
    func SetSelectedPickerValue(strSelectOption: String) { 
       print(strSelectOption) 
     } 
    } 

} 

2.ChildVC.swift

class ChildVC: UIViewController{ 

    // MARK: Variable for ParentVCData Passing 
    var arrPass = NSMutableArray() 

    override func viewWillAppear(_ animated: Bool) { 
     print(arrPass) 
    } 

    //Remove ChildVC 
    @IBAction func btnRemoveChildVC(_ sender: UIButton) { 
     self.delegate?.SetSelectedPickerValue!(strSelectOption: “any String you pass ChildVC To ParentVC”) 
     removeChildViewController(childVC: self) 
    } 
} 
// MARK: Create Delegate Method 
@objc protocol ChildVCDelegate{ 
    @objc optional func SetSelectedPickerValue(strSelectOption:String) 
}