[英]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(for
從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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.