2017-06-04 6 views
0

Ich versuche, Daten mit einer prepare(for segue:) Funktion zu übergeben, aber es zeigt Null in der zweiten VC. Mache ich etwas falsch?So übertragen Sie Daten zwischen View Controller mithilfe von Segmenten

class ViewController: UIViewController { 

    var first : [String] = [] 

    @IBOutlet weak var passField: UITextField! 
    @IBOutlet weak var userID: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func login(_ sender: Any) { 
     let user : String = self.userID.text! 
     let password : String = self.passField.text! 

     if user != "" && password != "" { 
      let postString = ["username":user, “password”: password] 
      var request = URLRequest(url:URL(string:"http://mydomainhere.com/api/login")!) 
      request.httpMethod = "POST" 
      request.httpBody = try! JSONSerialization.data(withJSONObject: postString, options:.prettyPrinted) 
      let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 
       if error != nil { 
        print("error=\(error)") 
        return 
       } 

       do { 
        if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any] { 
         let firstName = json["first_name"] as? String 
         let lastName = json["last_name"] as? String 
         self.first.append(firstName!) //putting into Array 
         self.performSegue(withIdentifier: "loginSegue", sender: self) 
        } 
       } catch { 
        print(error) 
       } 
      } 
     } 
    } 

    // data transfer to another controller 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "loginSegue" { 
      let secondController = segue.destination as? SecondVC 
      secondController?.name = first //passing to next VC //* here having the issue its not passing the data to next VC 
      print(first) // here first is printing perfectly 
     } 
    } 
} 


// second View Controller 
class SecondVC: UIViewController { 

    var menu_vc : MenuViewController! 
    var name : [String]? // passing to this Array 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print(name) // here printing nil 
    } 
} 
+0

Legen Sie einen Haltepunkt in prepareForSegue fest, und gehen Sie schrittweise vor, um zu sehen, was passiert. Der Downcast des Ansichtscontrollers schlägt möglicherweise fehl. – Paulw11

+0

@ Paulw11 Danke für die Antwort, aber ich verstehe dich nicht. Kannst du mir bitte etwas Code vorschlagen Was ich eigentlich machen muss. –

+0

Ich kann keinen Code vorschlagen. Der Code, den Sie haben, sieht im Allgemeinen korrekt aus. Erfahren Sie, wie Sie mit dem leistungsstarken Debugger, der in Xcode integriert ist, durch Ihre App navigieren und sehen können, was sie tut. – Paulw11

Antwort

0

Wie @Sweeper vorgeschlagen, ist es sehr gut, dass Ihr Ziel-View-Controller in einem UINavigationViewController eingebettet sein könnte, damit Ihr segue.destination ist in Tatsache ein UINavigationViewController, kein SecondVC.

Sie können diesen Code versuchen:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    var destinationViewController = segue.destination 
    if let navigationController = destinationViewController as? UINavigationController { 
     destinationViewController = navigationController.visibleViewController ?? destinationViewController 
    } 
    if let secondController = destinationViewController as? SecondVC { 
     secondController?.name = first 
    } 
} 

Natürlich sind die ersten vier Zeilen Code in einer entsprechenden Funktion Refactoring werden konnte (noch besser, wenn in einer Verlängerung von UIViewController).

Wenn das das Problem löst, können Sie cs193p Stanford iOS-Kurs für weitere Details ansehen. Insbesondere Uhr https://www.youtube.com/watch?v=HQrXM2zUPvY&index=6&list=PLPA-ayBrweUz32NSgNZdl0_QISw-f12Ai ab der 30.20 Marke.

+0

das ist großartig. hat perfekt funktioniert. Vielen Dank! –

0

Alles scheint perfekt mit der unten Snippet

var first : [String] = [] 

@IBAction func btnTapped(_ sender: Any) { 
    let firstName = "iOS Geek" 
    self.first.append(firstName) 

    self.performSegue(withIdentifier: "MovetoSecVC", sender: self) 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "MovetoSecVC"{ 

     let secVC = segue.destination as! SecondVC 
     secVC.name = first 
     print(first) // it'll print here ["iOS Geek"] 
    } 
} 

// Your Second View Controller 

class SecondVC: UIViewController { 

var menu_vc : MenuViewController! 
var name : [String]? // passing to this Array 

override func viewDidLoad() { 
    super.viewDidLoad() 

    print(name!) // it'll print here ["iOS Geek"] 
    } 
} 
Verwandte Themen