簡體   English   中英

在視圖控制器之間傳遞數據時出錯

[英]Error passing data between view controllers

我試圖在Swift中將數據從一個視圖控制器傳遞到另一個。

View Controller 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(接收)中的“准備segue”中:

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"

這一點:

if let selectedFiName = sender as!  ,

甚至不應該編譯。

您需要一種類型,例如

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

視圖1:

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在main.storyboard中的ViewControllers類下的View2(要顯示的那個)屬性檢查器中設置。 為了簡單起見,我通常將其與ViewController名稱相同,但字符串必須完全匹配,否則會崩潰。

在View2中,您只需要這樣聲明變量:

var fiDetails = SecondTable()

在視圖控制器類的開始而不是在viewDidLoad內部執行

我知道這不是安全的,但是我發現它更方便,因為您也不需要在情節提要中建立任何連接,從功能而不是安全的角度呈現下一個視圖。

如果要將PassData結構傳遞給第二個視圖控制器,請在performSegue...中將其作為sender參數傳遞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)
}

在目標視圖控制器中,創建屬性fiDetails而不是局部變量。 然后將文本分配給標簽的text屬性。

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"

prepare(for的源代碼視圖控制器中prepare(forsender參數獲取結構並將其分配給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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM