Quiero pasar datos entre dos controladores de vista, pero no quiero que la vista cambie cuando los usuarios presionen mi botón de guardar datos.

Los usuarios deben completar múltiples campos de datos, y cuando terminen pueden presionar otro botón para ir al segundo controlador de vista.

Encontré muchos tutoriales sobre cómo pasar datos usando segue, pero todos cambian de vista tan pronto como se presiona el botón 'Guardar'.

¿Alguien puede explicarme cómo alterar el código?

@Phillip Mills: así es como usé tu código. (¿Qué estoy haciendo mal?)

Código: //////// declarando clases en FirstViewController (probándolo primero en un solo ViewController)

class FakeVC1 {
    func userInput() {
        DataModel.shared.username = outbj14u.text
}

class FakeVC2 {
    func viewAppears() {
        if let name = DataModel.shared.username {
            outbj14p.text = name
            print("I have nothing to say")
        }
    }
}

class DataModel {
    static let shared = DataModel()
    var username: String?
}



////till here

//// aquí es donde llamo a las funciones

override func viewDidAppear(_ animated: Bool) {

    FakeVC1().userInput()
    FakeVC2().viewAppears()

    if let xbj14p = UserDefaults.standard.object(forKey: "outbj14p") as? String
    {
        outbj14p.text = xbj14p
    }






    if let xbj14u = UserDefaults.standard.object(forKey: "outbj14u") as? String
    {
        outbj14u.text = xbj14u
    }

////

@Phillip Mills: A continuación se muestra lo que sé. Creo que obtuve el código en FirstViewController correctamente, pero el código en el controlador Second View debe estar equivocado. No obtengo ningún error, pero el campo de texto en el SecondViewController permanece sin cambios después de poner la entrada en el FirstViewController

//// Código en FirstViewController

class DataModel {
    static let shared = DataModel()
    var username: String?
}


@IBAction func savebj14p(_ sender: Any) {
    outbj14p.text = inbj14p.text
    DataModel.shared.username = outbj14p.text
    UserDefaults.standard.set(inbj14p.text, forKey: "namebj14p")
}

// y en el SecondViewController

@IBOutlet weak var bj14u: UILabel! // connected to a label

//and

class DataModel {
    static let shared = DataModel()
    var username: String?
}


override func viewDidAppear(_ animated: Bool) {


    if let name = DataModel.shared.username {
        bj14u.text = name
    }

}
-1
Andre 17 oct. 2017 a las 15:24

3 respuestas

La mejor respuesta

En su caso, no pase datos.

Cree un objeto compartido para que actúe como su modelo de datos. Cuando los usuarios completen los campos, actualice el modelo de datos.

Cuando el usuario se mueve al segundo controlador / vista, ese controlador utiliza el objeto del modelo de datos para mostrar lo que necesita.

class FakeVC1 {
    func userInput() {
        DataModel.shared.username = "Me"
    }
}

class FakeVC2 {
    func viewAppears() {
        if let name = DataModel.shared.username {
            print(name)
        } else {
            print("I have nothing to say")
        }
    }
}

class DataModel {
    static let shared = DataModel()
    var username: String?
}

FakeVC1().userInput()
FakeVC2().viewAppears()
1
Phillip Mills 17 oct. 2017 a las 13:49

Lo que recomendaré es usar una variable o matriz global, tendrá la información en todos los controladores de vista y podrá llamarla en su nuevo controlador de vista.

0
Carlos Norena 17 oct. 2017 a las 14:26

Si necesita pasar valor a otro controlador de vista sin cambiar la vista, puede usar la clase NSNotificationCenter

Consulte este enlace para más detalles

NSNotificationCenter addObserver en Swift

0
DHEERAJ 17 oct. 2017 a las 13:21