ventanas ventana variable una tabla pasar modales modal formulario enviar ejemplos datos data como bootstrap ios swift

ios - ventana - pasar datos modal



Cómo pasar datos desde el controlador de vista modal cuando se despide (4)

Dependiendo de los datos que quiera pasar, puede crear una propiedad en el controlador de vista de presentación, que puede establecer al descartar el controlador de vista modal, de modo que puede ahorrarle al delegado.

Por ejemplo, tiene un ContactsViewController , sosteniendo una var contacts: [Contact] = [] propiedad. Cuando desea crear un nuevo contacto, presenta un controlador de vista modal con los diferentes valores que necesita para crear un nuevo objeto de Contact . Cuando haya terminado y desee descartar el controlador de vista, llame a la función como lo hizo en su código, pero establezca la propiedad en ContactsViewController . Se verá algo como esto:

@IBAction func dismissViewController(_ sender: UIBarButtonItem) { if let presenter = presentingViewController as? ContactsViewController { presenter.contacts.append(newContact) } dismiss(animated: true, completion: nil) }

EDITAR:

Si no desea utilizar un delegado, esta es la forma en que lo hace:

En su OOTDListViewController :

var testValue: String = "" @IBAction func printReceivedValue(_ sender: UIButton) { print(testValue) }

En su controlador de vista modal (lo llamaré PresentedViewController ):

@IBAction func dismissViewController(_ sender: UIBarButtonItem) { // if your OOTDListViewController is part of a UINavigationController stack, this check will probably fail. // you need to put a breakpoint here and check if the presentingViewController is actually a UINavigationController. // in that case, you will need to access the viewControllers variable and find your OOTDListViewController if let presenter = presentingViewController as? OOTDListViewController { presenter.testValue = "Test" } dismiss(animated: true, completion: nil) }

Si desea utilizar un delegado, esta es la forma de hacerlo:

En su OOTDListViewController:

protocol ModalDelegate { func changeValue(value: String) } class OOTDListViewController: ModalDelegate { var testValue: String = "" @IBAction func presentViewController() { // here, you either create a new instance of the ViewController by initializing it, or you instantiate it using a storyboard. // for simplicity, I''ll use the first way // in any case, you cannot use a storyboard segue directly, bevause you need access to the reference of the presentedViewController object let presentedVC = PresentedViewController() presentedVC.delegate = self present(presentedVC, animated: true, completion: nil) } func changeValue(value: String) { testValue = value print(testValue) }

}

En su PresentedViewController :

class PresentedViewController { var delegate: ModalDelegate? var testValue: String = "" @IBAction func dismissViewController(_ sender: UIBarButtonItem) { if let delegate = self.delegate { delegate.changeValue(testValue) } dismiss(animated: true, completion: nil) } }

He seguido las instrucciones here pero todavía no estoy seguro de esta parte:

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

He intentado crear una instancia del controlador de vista mediante programación, pero aún no he tenido éxito.

Aquí está mi código para cuando se descarta el controlador de vista modal:

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

Estoy usando el guión gráfico para continuar con la vista modal.

Estos son los datos que deseo transferir al controlador de vista principal:

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

Que son dos valores de cadena.

Editar:

He intentado pasar datos desde el controlador de vista modal como se muestra:

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

mientras que en el controlador de vista padre lo hice como tal:

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

Todavía no pude recibir ningún valor cuando presioné el botón de impresión.

Controlador de vista modal:

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) }

Controlador de vista principal:

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) }

Editar:

Aquí está mi nuevo código sin usar el método de delegado:

Controlador de vista modal:

@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) }


Estoy usando la barra de pestañas, por lo que el código de trabajo es el siguiente

if let tabBar = self.presentingViewController as? UITabBarController { let homeNavigationViewController = tabBar.viewControllers![0] as? UINavigationController let homeViewController = homeNavigationViewController?.topViewController as! HomeController homeViewController._transferedLocationID = self.editingLocationID! }


Si usa un controlador de navegación, primero tendrá que tomar el controlador de UINavigation y luego obtener el controlador de visualización correcto de la pila del controlador de navegación.

Así es como se veía mi código en ese caso.

@IBAction func dismissViewController(_ sender: UIBarButtonItem) { if let navController = presentingViewController as? UINavigationController { let presenter = navController.topViewController as! OOTDListViewController presenter.testValue = "Test" } dismiss(animated: true, completion: nil) }


dismissViewController llamar al método delegado en el método dismissViewController

@IBAction func dismissViewController(_ sender: UIBarButtonItem) { delegate?.sendData(typeState: "top", categoryState: "casual") self.dismiss(animated: true) { // } }

en tu clase Modal ViewController crea delegado

var delegate: MyProtocol?

cree un protocolo con el nombre del método sendData en MyProtocol y en su presentadorViewController donde está asignando el delegado, implemente el método MyProtocol

protocol MyProtocol: class { func sendData(typeState: String, categoryState: String) } class ViewController: UIViewController, MyProtocol { var typeState: String? var categoryState: String? func sendData(typeState: String, categoryState: String) { self.typeState = typeState self.categoryState = categoryState } }