【问题标题】:Error passing data between view controllers在视图控制器之间传递数据时出错
【发布时间】:2017-05-06 18:22:14
【问题描述】:

我试图在 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(接收)的“准备转场”中:

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"

【问题讨论】:

    标签: ios swift segue


    【解决方案1】:

    这一点:

    if let selectedFiName = sender as!  ,
    

    甚至不应该编译。

    你需要一个类型,比如

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

    【讨论】:

      【解决方案2】:

      视图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 中设置,在 View2(你想要呈现的那个)属性检查器中,在 viewControllers 类下。为简单起见,我通常将其与 ViewController 名称保持相同,但字符串必须完全匹配,否则会崩溃。

      在 View2 中你只需要像这样声明你的变量:

      var fiDetails = SecondTable()
      

      在视图控制器类的开始处执行,而不是在 viewDidLoad 内部

      我知道这不是一个转场,但我发现它更方便,因为您也不需要在情节提要中建立任何联系,下一个视图是从函数而不是转场呈现的。

      【讨论】:

        【解决方案3】:

        如果要将PassData 结构体传递给第二个视图控制器,请将其作为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 而不是局部变量。然后将文本分配给标签的文本属性。

        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 的源视图控制器中,从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
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多