简体   繁体   中英

Passing data between different ViewControllers

I'm trying to pass data between ViewController and secondViewController by using override func prepare(for segue: UIStoryboardSegue, sender: Any?) .

I'm using a third-party library that controls Tesla cars. What I want is that when the first switch on ViewController is ON, the function startCharging will get executed. I get this error:

The data couldn't be read because it isn't in the correct format.

I'm assuming it isn't passing the data between the ViewControllers.

This code should print command sent successfully when the first switch is on.

Swift:

let vehicle = ""
let accessToken = ""
let password = ""
let email = ""
class SecondViewController: UIViewController, UITextFieldDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        UserName.delegate = self
        Password.delegate = self
    }

    @IBAction func Enter(_ sender: Any) {
        TextView.text = "Username: \(UserName.text!)\nPassword:\     (Password.text!)"
        let email = (UserName.text!)
        let password = (Password.text!)
        teslaAPI.getAccessToken(email: email, password: password) {
            (httpResponse, dataOrNil, errorOrNil) in
            guard let accessToken = dataOrNil?.accessToken else {
                return
            }
            // Set the accessToken for use with future requests
            self.teslaAPI.setAccessToken(accessToken)
            // Get vehicles
            self.teslaAPI.getVehicles {
                (httpResponse, dataOrNil, errorOrNil) in
                guard let vehicle = dataOrNil?.vehicles.first else {
                    return
                }
                self.teslaAPI.wake(vehicle, completion: {
                    (res, _, err) in
                    guard res else {
                        return
                    }
                })
            }
        }
        self.performSegue(withIdentifier: "nextPage", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        var vc = segue.destination as! ViewController
        vc.finalVehicle = vehicle
        var vc2 = segue.destination as! ViewController
        vc2.finalAccessToken = accessToken
        var vc3 = segue.destination as! ViewController
        vc3.finalEmail = email
        var vc4 = segue.destination as! ViewController
        vc4.finalPassword = password
    }
}

//This is from the other ViewController where I want the data to be      
//passed.
class ViewController: UIViewController {
    var finalVehicle = ""
    var finalAccessToken = ""
    var finalEmail = ""
    var finalPassword = ""
    @IBAction func chargeOffPeakSwitch(_ sender: UISwitch) {
        if (sender.isOn == true)
            DispatchQueue.main.asyncAfter(deadline: .now() + 30.0)  {
                // Change `2.0` to the desired number of seconds.
                // Code you want to be delayed
                //send command to unlock doors
                // let command = Command.unlockDoors
                let command = Command.flashLights
                self.teslaAPI.send(command, to: self.finalVehicle) {
                    response in
                    if response.result {
                        print("Command sent successfully!")
                    }
                }
        }
    }
}

Kindly share you code on git for further help. but i hope it will work

  class SecondViewController: UIViewController, UITextFieldDelegate {

            var vehicle = ""
            var accessToken = ""
            var password = ""
            var email = ""
            override func viewDidLoad() {
                super.viewDidLoad()
                UserName.delegate = self
                Password.delegate = self
            }

            @IBAction func Enter(_ sender: Any) {
                TextView.text = "Username: \(UserName.text!)\nPassword:\     (Password.text!)"
                let email = (UserName.text!)
                let password = (Password.text!)
                teslaAPI.getAccessToken(email: email, password: password) { [unowned self]
                    (httpResponse, dataOrNil, errorOrNil) in
                    guard let accessToken = dataOrNil?.accessToken else {
                        return
                    }
                    self.accessToken = accessToken
                    // Set the accessToken for use with future requests
                    self.teslaAPI.setAccessToken(accessToken)
                    // Get vehicles
                    self.getVehicle()

                }
            }
            func getVehicle() {
                self.teslaAPI.getVehicles { [unowned self]
                     (httpResponse, dataOrNil, errorOrNil) in
                    guard let vehicle = dataOrNil?.vehicles.first else {
                        return
                    }
                    self.vehicle =  vehicle
                    self.performSegue(withIdentifier: "nextPage", sender: self)

                    self.invokeWake(vehicle: vehicle)
                }
            }
            func invokeWake(vehicle:String) {
                self.teslaAPI.wake(vehicle, completion: {
                    (res, _, err) in
                    guard res else {
                        return
                    }
                })
            }

            override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                var vc = segue.destination as! ViewController
                vc.finalVehicle = vehicle
                vc.finalAccessToken = accessToken
                vc.finalEmail = email
                vc.finalPassword = password
            }
        }

        //This is from the other ViewController where I want the data to be
        //passed.
        class ViewController: UIViewController {
            var finalVehicle = ""
            var finalAccessToken = ""
            var finalEmail = ""
            var finalPassword = ""
            @IBAction func chargeOffPeakSwitch(_ sender: UISwitch) {
                if (sender.isOn == true)
                DispatchQueue.main.asyncAfter(deadline: .now() + 30.0)  {
                    // Change `2.0` to the desired number of seconds.
                    // Code you want to be delayed
                    //send command to unlock doors
                    // let command = Command.unlockDoors
                    let command = Command.flashLights
                    self.teslaAPI.send(command, to: self.finalVehicle) {
                        response in
                        if response.result {
                            print("Command sent successfully!")
                        }
                    }
                }
            }
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM