RDowns
RDowns

Reputation: 659

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 funcas 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

Upvotes: 0

Views: 40

Answers (1)

balkaran singh
balkaran singh

Reputation: 2786

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

    }

}

Upvotes: 0

Related Questions