2017-08-12 6 views
0

prepare(segue)メソッドでデータを渡そうとしましたが、ReceiverViewControllerで渡されたデータを取得できません。私はインスタンス全体をより良く渡すことができ、可能かどうかわからないのだろうか。 私はSwiftの初心者です。これが私の最初の試行です。アドバイスは大歓迎です。複数のコントローラ間でsegueを用意して特定のキー/値を渡す

私が使用したいクラスは以下の通りです - UserClass.swift:

class User { 
    var firstname: String 
    var lastname: String 
    var role: Int 

    init(firstname: String, lastname: String, role: Int) { 
     self.firstname = firstname 
     self.lastname = lastname 
     self.role = role 
    } 

} 

マイここFirstViewController.swift

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "loadBoard" { 
     if let dVC = segue.destination as? ReceiverViewController { 
      dVC.code?.firstname = anotherValue 

      //Following show me nil 
      print("Sent data \(dVC.code?.firstname)") 
     } 
    } 
} 

上のメソッドを用意し、私はデータを取得しようとしましたものです - ReceiverViewController .swift:

var code: User? 

if let test = self.code?.firstname { 
    self.categoryLabel.text = code?.firstname 
    print(code) 
} else { 
    print("Something wrong") 
} 
+1

あなたのコードのどこかで 'code'プロパティを初期化していますか? – Kymer

+0

インスタンス全体を渡します。それは動作するはずです。 –

+0

コントローラー間でデータをやりとりするのは難しくありませんが、ちょっと混乱するかもしれません。 [この例](https://github.com/ryantxr/legendary-potato)には、それを行う方法が示されています。 – ryantxr

答えて

1

prepareForSegueは、宛先の前に呼び出されます。viewControll erのviewDidLoadです。 ReceiverViewControllerのviewDidLoad中にUserに設定されているcodeプロパティに頼っているのであれば、あなたのアプローチはうまくいかないでしょう。

したがって、prepareForSegueでReceiverViewControllerのcodeプロパティを設定するか、firstnameでReceiverViewControllerの別のプロパティを設定してから、ReceiverViewControllerのviewDidLoad中にfirstnameをコードに割り当てる必要があります。

0

prepareForSegueで、初期化されていないオブジェクトであるcode: User?にプロパティを設定しようとしています。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "loadBoard" { 
     if let dVC = segue.destination as? ReceiverViewController, 
      let user = sender as? User { 
       dVC.code = user 

     } 
    } 
} 
0

これは別のコントローラとの間でデータを送受信する方法の例です:あなたが代わりに行うことができますすることperformSegueへのお電話での初期化Userオブジェクトを渡した後、次の手順を実行しています。

destinationForSegueは、宛先コントローラがロードされる前に呼び出されます。 このため、送信先コントローラの要素を送信コントローラ内で設定することはできません。 ここでのアプローチは、送信するデータで他の変数を設定することです。 宛先ビューコントローラで、viewWillAppearでデータを処理します。

送信コントローラ:

// https://github.com/ryantxr/legendary-potato 
// ViewController.swift 
// data-share 
// 
// Created by ryan teixeira on 3/21/16. 
// Copyright © 2016 Ryan Teixeira. All rights reserved. 
// 
import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var helloTextField: UITextField! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
     if segue.identifier == "showDetail" { 
      print("detail segue") 
      let destinationController = segue.destinationViewController as! DetailViewController 
      destinationController.helloText = helloTextField.text 
     } 
    } 
} 

受信ビューコントローラ:

// https://github.com/ryantxr/legendary-potato 
// DetailViewController.swift 
// data-share 
// 
// Created by ryan teixeira on 3/21/16. 
// Copyright © 2016 Ryan Teixeira. All rights reserved. 
// 
import UIKit 

class DetailViewController: UIViewController { 

    var helloText: String? 
    @IBOutlet weak var helloLabel: UILabel! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func viewWillAppear(animated: Bool) { 
     helloLabel.text = helloText 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    /* 
    // MARK: - Navigation 
    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 
関連する問題