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.