2017-05-05 13 views
0

Swiftのビューコントローラから別のビューコントローラにデータを渡そうとしています。ビューコントローラ間でデータを渡す際にエラーが発生しました

ビューコントローラ1:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let selectedFiName = self.fetchedFiName[indexPath.row].fiName 
    let selectedOneYear = self.fetchedFiName[indexPath.row].oneYear 
    let selectedTwoYear = self.fetchedFiName[indexPath.row].twoYear 
    let selectedThreeYear = self.fetchedFiName[indexPath.row].threeYear 
    let selectedFourYear = self.fetchedFiName[indexPath.row].fourYear 
    let selectedFiveYear = self.fetchedFiName[indexPath.row].fiveYear 

    passData = [SecondTable(passedFIName: selectedFiName, passedOneYear: selectedOneYear, passedTwoYear: selectedTwoYear, passedThreeYear: selectedThreeYear, passedFourYear: selectedFourYear, passedFiveYear: selectedFiveYear)] 


    performSegue(withIdentifier: "SecondViewController", sender: self) 
} 

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

    if let selectedFiName = sender as! , 
    let destVC = segue.destination as? SecondViewController { 
     destVC.fiName = selectedFiName 
    } 
} 

エラーは、ビューコントローラ2(receieving)の "セグエの準備" に示す:

struct SecondTable { 

    var passedFIName: String = "" 
    var passedOneYear: String = "" 
    var passedTwoYear: String = "" 
    var passedThreeYear: String = "" 
    var passedFourYear: String = "" 
    var passedFiveYear: String = "" 

} 

class SecondViewController: UIViewController { 

    @IBOutlet weak var fiName: UILabel! 
    @IBOutlet weak var sometext: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let fiDetails = SecondTable() 

     fiName.text = SecondTable.passedFIName 
     sometext.text = "Some Text" 

答えて

0

このビット:

if let selectedFiName = sender as! , 

万一コンパイルさえしない。

あなたは

if let selectedFiName = sender as? String, 
    let destVC = segue.destination as? SecondViewController { 
    //Your code here 
} 
0

View1を同じように、タイプを必要とする:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    // create your struct object but in this example you're not passing an array so get rid of the [ ] 

    presentNextView(passing: passData) 
} 

func presentNextView(passing: SecondTable) { 
    let next = self.storyboard?.instantiateViewController(withIdentifier: "identifierHere") as! View2 
    next.fiDetails = passing 
    self.present(next, animated: true) 
} 

identifierHereがviewControllers下、VIEW2(あなたが提示したい1)属性インスペクタで、あなたのmain.storyboardに設定されていますクラス。私は通常、簡単にするためにViewControllerの名前と同じにしておきますが、文字列は完全に一致する必要があります。そうしないとクラッシュします。

あなたは、単にこのようなあなたの変数を宣言する必要がVIEW2で

var fiDetails = SecondTable() 

がないのviewDidLoad

の内側に、View Controllerクラスの開始時に、それを実行してください、私はそれがセグエではないと知っているけどあなたのストーリーボードにも接続する必要はないので、もっと便利であることがわかります。次のビューは、セグの機能ではなく、機能から提示されます。

0

あなたは2番目のビューコントローラにPassData構造体を渡したい場合は、プロパティfiDetailsではなく、ローカル変数を作成し、宛先ビューコントローラでperformSegue...

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let fetchedItem = self.fetchedFiName[indexPath.row] 
    let selectedFiName = fetchedItem.fiName 
    let selectedOneYear = fetchedItem.oneYear 
    let selectedTwoYear = fetchedItem.twoYear 
    let selectedThreeYear = fetchedItem.threeYear 
    let selectedFourYear = fetchedItem.fourYear 
    let selectedFiveYear = fetchedItem.fiveYear 

    passData = [SecondTable(passedFIName: selectedFiName, passedOneYear: selectedOneYear, passedTwoYear: selectedTwoYear, passedThreeYear: selectedThreeYear, passedFourYear: selectedFourYear, passedFiveYear: selectedFiveYear)] 

    performSegue(withIdentifier: "SecondViewController", sender: passData) 
} 

senderパラメータとして渡します。次に、テキストをラベルのtextプロパティに割り当てます。 prepare(forソースビューコントローラで

class SecondViewController: UIViewController { 

    @IBOutlet weak var fiName: UILabel! 
    @IBOutlet weak var sometext: UILabel! 

    var fiDetails = SecondTable() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     fiName.text = fiDetails.passedFIName 
     sometext.text = "Some Text" 

senderパラメータから構造体を取得し、fiDetailsプロパティに割り当て:

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

    if segue.identifier == "SecondViewController" {   
     let destVC = segue.destination as! SecondViewController 
     let fiDetails = sender as! SecondTable 
     destVC.fiDetails = fiDetails 
    } 
} 
関連する問題