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 ladismissViewController
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 leOOTDListViewController
fait partie d'une pile de navigation, vous pouvez avoir besoin de regarder pour elle dans leviewControllers
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
Vous devez vous connecter pour publier un commentaire.
Selon les données que vous souhaitez passer, vous pouvez créer une propriété dans la présentation de-vue-contrôleur, que vous pouvez définir pour rejeter le modèle-vue-contrôleur, de sorte que vous pouvez vous épargner le délégué.
Par exemple, vous avez un
ContactsViewController
, la tenue d'unevar contacts: [Contact] = []
de la propriété. Lorsque vous souhaitez créer un nouveau contact, vous présenter un modal-vue-contrôleur avec les différentes valeurs que vous avez besoin pour créer un nouveauContact
objet. Lorsque vous avez terminé et souhaitez rejeter le point de vue du contrôleur, vous devez appeler la fonction comme vous l'avez fait dans votre code, mais de définir la propriété dans laContactsViewController
. Il ressemblera à quelque chose comme ceci:EDIT:
Si vous ne pas souhaitez utiliser un délégué, c'est la façon dont vous aller à ce sujet:
Dans votre
OOTDListViewController
:Dans votre modal-vue-contrôleur (je vais l'appeler
PresentedViewController
) :Si vous voulez utiliser un délégué, c'est la façon de le faire:
Dans votre OOTDListViewController:
}
Dans votre
PresentedViewController
:Vous devez appeler la méthode du délégué dans
dismissViewController
méthodeen vous Modal ViewController création de la classe de délégué
créer un protocole avec le nom de la méthode sendData dans MyProtocol et dans votre presentingViewController où vous attribuez le délégué, de mettre en œuvre la MyProtocol méthode
je suis l'aide de la tabbar de sorte que le code du travail comme ci-dessous
Si vous utilisez une manette de navigation, vous devrez d'abord prendre le UINavigation Contrôleur de gestion, puis obtenir le ViewController de la manette de Navigation de la pile.
Voici comment mon code regardé dans ce cas.