Richard Downs Richard Downs - 1 month ago 14
Swift Question

What is the correct way to call this function and pass this array via a segue?

I am trying to pass an array from

loginViewController
to
ViewController
using a segue.

The array is
communtiesArray
and is fetched in this section of code:

let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]

if let arr = json?["communities"] as? [[String:String]] {
self.communitiesArray = arr.flatMap { $0["name"]! }
}
print ("first test: ",self.communitiesArray) // This prints values OK.


As stated, this debug test prints correctly. I now try to pass
communities.Array
through a segue to ViewController in this function:

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if segue.identifier == "loginView" {
let createViewController: ViewController = segue.destination as! ViewController
createViewController.communities = communitiesArray
print("second test: ", communitiesArray) //this prints nothing
}
}


I feel I must going wrong in my use of this as an
override func
as it did not seem to get called as
print
debug does not activate.

This is the full userLogin script:

import UIKit

protocol UsernameSentDelegate {
func userLoggedIn(data: String)
}

class LoginViewController: UIViewController {

var delegate: UsernameSentDelegate? = nil

@IBOutlet weak var userEmailTextField: UITextField!
@IBOutlet weak var userPasswordTextField: UITextField!
@IBOutlet weak var displayUserName: UILabel!
var communitiesArray = [String]()


@IBAction func loginButtonTapped(_ sender: AnyObject)
{

let userEmail = userEmailTextField.text;
let userPassword = userPasswordTextField.text;

if (userPassword!.isEmpty || userEmail!.isEmpty) { return; }

// send user data to server side

let myUrl = URL(string: "http://www.quasisquest.uk/KeepScore/userLogin.php");
var request = URLRequest(url:myUrl!);
request.httpMethod = "POST";
let postString = "email=\(userEmail!)&password=\(userPassword!)";
request.httpBody = postString.data(using: String.Encoding.utf8);

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
DispatchQueue.main.async
{
if(error != nil)
{

//Display an alert message
let myAlert = UIAlertController(title: "Alert", message: error!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert);
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
return
}

do {

let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]

if let arr = json?["communities"] as? [[String:String]] {
self.communitiesArray = arr.flatMap { $0["name"]! }
}
print ("first test: ",self.communitiesArray) // This print correctly in debug

// retrieve login details and check to see if all ok

if let parseJSON = json {

let returnValue = parseJSON["status"] as? String

if(returnValue != "error")
{

self.delegate?.userLoggedIn(data: userEmail! )

UserDefaults.set(UserDefaults.standard)(true, forKey: "isUserLoggedIn");

self.dismiss(animated: true, completion: nil)

} else {
// display an alert message
let userMessage = parseJSON["message"] as? String
let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert);
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
}

}
} catch
{
print(error)
}

}

}

task.resume()

}


override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{

if segue.identifier == "loginView" {
let createViewController: ViewController = segue.destination as! ViewController
createViewController.communities = communitiesArray
print("second test: ", communitiesArray) //this prints nothing
}

}


}


In reference to the error I am receiving as stated in comments section, this is the code from
ViewController
that contains the variable for line
createViewController.communities = sender as? Array


import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UsernameSentDelegate {

@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var receiveUsername: UILabel!
@IBOutlet weak var userEmailText: UILabel!
var userEmail: String?
var communities = [String]() // this is the target of the segue

Answer

plz perform segue like this

   performSegue(withIdentifier: "loginView", sender: self.communitiesArray)

and in prepare for segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{

    if segue.identifier == "loginView" {
        let createViewController: ViewController = segue.destination as! ViewController
        createViewController.communities = sender as? Array

    }

}
Comments