Comment passer des données à partir de modal-vue-contrôleur en arrière quand rejeté

J'ai suivi les instructions ici mais je suis toujours pas sûr de cette partie:

modalVC.delegate=self;
        self.presentViewController(modalVC, animated: true, completion: nil) 

J'ai essayé de l'instanciation de la vue-contrôleur par programme, mais toujours en vain.

voici mon code pour quand rejetant le modèle-vue-contrôleur:

@IBAction func dismissViewController(_ sender: UIBarButtonItem) {
        self.dismiss(animated: true) { 
            //
        }
    }

Je suis en utilisant le storyboard d'enchaîner avec vue modal.

C'est les données que je souhaite transférer à la maison mère-vue-contrôleur:

var typeState = "top"
 var categoryState = "casual"

Qui sont deux valeurs de Chaîne.

Edit:

J'ai essayé de transmettre les données du modal-vue-contrôleur comme indiqué:

@IBAction func dismissViewController(_ sender: UIBarButtonItem) {
        self.dismiss(animated: true, completion: nil)
        delegate?.sendValue(value: "success")
        if let presenter = presentingViewController as? OOTDListViewController {
            presenter.receivedValue = "test"
        }
    }

alors que sur la vue parent contrôleur je l'ai fait en tant que tel:

func sendValue(value: NSString) {
        receivedValue = value as String
    }
  @IBAction func printReceivedValue(_ sender: UIButton) {
        print(receivedValue)
    }

Encore je ne pourrais pas recevoir toute valeur, quand j'appuie sur le bouton imprimer.

Modal-vue-contrôleur:

protocol ModalViewControllerDelegate
{
    func sendData(typeState: String, categoryState: String)
}

var delegate:ModalViewControllerDelegate!

var typeState = "top"
var categoryState = "casual"
@IBAction func dismissViewController(_ sender: UIBarButtonItem) {
        self.dismiss(animated: true, completion: nil)
        delegate?.sendData(typeState: typeState as String, categoryState: categoryState as String)

    }

Parent-vue-contrôleur:

class parentViewController: UICollectionViewController, ModalViewControllerDelegate {

var typeState: String?
var categoryState: String?
func sendData(typeState: String, categoryState: String) {
        self.typeState = typeState as String
        self.categoryState = categoryState as String
    }
 @IBAction func printReceivedValue(_ sender: UIButton) {
     print(typeState)
 }

Edit:

Voici mon nouveau code sans utiliser la méthode du délégué:

Modal-vue-Contrôleur:

@IBAction func dismissViewController(_ sender: UIBarButtonItem) {
        self.dismiss(animated: true, completion: nil)
        if let presenter = presentingViewController as? OOTDListViewController {
            presenter.typeState = typeState
            presenter.categoryState = categoryState
        }
    }

OOTDListViewController:

@IBAction func presentModalView(_ sender: UIBarButtonItem) {
        let modalView = storyboard?.instantiateViewController(withIdentifier: "filterViewController") as! ModalViewController
        let navModalView: UINavigationController = UINavigationController(rootViewController: modalView)
        self.present(navModalView, animated: true, completion: nil)
    }
@IBAction func printValue(_ sender: UIButton) {
        print(typeState)
        print(categoryState)
    }
  • Vous présentez le viewcontroller avec un ou segue dans le code?
  • Je vais présenter le modal avec vue storyboard segue
  • l'impression de toujours retourné à néant ou le vide répondre
  • Vous devez définir les valeurs de avant rejetant le viewController, sinon le presentingViewController sera toujours nul. Donc, déplacez le self.dismiss appel à la fin de la dismissViewController fonction.
  • ne fonctionne toujours pas. Ne rien avoir à faire avec moi initier une manette de navigation de la hiérarchie?
  • Non, ce ne devrait pas interférer. Avez-vous mis un point d'arrêt sur if let presenter = presentingViewController as? OOTDListViewController pour voir si la vérification échoue ou pas? Comme je l'ai dit dans ma réponse, si le OOTDListViewController fait partie d'une pile de navigation, vous pouvez avoir besoin de regarder pour elle dans le viewControllers propriété de la racine de la manette de navigation.
  • Yup, j'ai essayé le point d'arrêt. si laisser présentateur = presentingViewController comme? OOTDListViewController n'était pas appelé. J'ai même ajouter un print("succes") si cette méthode a été appelé, mais il n'était pas Edit: ouais j'ai trouver un moyen de jeter la manette de navigation hiérarchie
  • Votre test fonctionne! Mais je n'ai vraiment aucune idée de pourquoi le mien ne marche pas :/ je vois exactement le même code ici. Je suppose que je vais rôle avec NS utilisateur par défaut pour la sélection. Mais encore une fois, merci beaucoup. Ça va être vraiment utile pour ceux qui souhaitent transférer des données à leur parent-vue-contrôleur sans l'aide de méthodes délégué
  • Mise à jour de l'échantillon projet avec un délégué approche, peut-être que ça va aider: github.com/smeshko/ModalDataPassing

InformationsquelleAutor lws803 | 2016-10-19