【问题标题】:Prepareforsegue not passing the appropriate value to destination Viewcontroller?Prepareforsegue 没有将适当的值传递给目标 Viewcontroller?
【发布时间】:2016-11-14 16:41:55
【问题描述】:

我有两个视图控制器(一个是 tableVC),我想在它们之间传递信息。这是该 tableVC 中的代码:

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

        var rowSelected = indexPath.row
        print(rowSelected) //always returns the correct integer

        func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

            let destViewController: newController = segue.destination as! newController
            newController.rowSelected = rowSelected
        }

        performSegue(withIdentifier: "rowSelected", sender: Any?.self)//segue to newController

    }

这是我希望将信息传递给的 newController 的代码:

 @IBOutlet weak var label: UILabel!

var rowSelected = Int()
override func viewDidLoad() {
    super.viewDidLoad()

    label.text = infoArray[rowSelected]

    print(rowSelected) //always logs 0 to the console, regardless of cell selection

}

我以为我已经正确设置了它,但无论出于何种原因,调用infoArray 的索引始终为 0,无论在 tableVC 中选择了哪个单元格。不知道是什么问题。

【问题讨论】:

标签: swift xcode


【解决方案1】:

在类作用域/全局作用域中写入prepareForSegue。在您的代码中 prepareForSegue 永远不会调用,因为您是在方法中编写它。通过performSegue 中的rowSelected 并使用sender 获取prepareForSegue 中的rowSelected 值,或者您可以使用tableViewindexPathForSelectedRow 属性。

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

performSegue(withIdentifier: "rowSelected", sender: rowSelected)

}



override  func prepareForSegue(segue: UIStoryboardSegue, sender: Any?) {
        let  rowSelected = sender as! Int 

      // or you can use  indexPathForSelectedRow for getting row value
     // let indexPath = self.tableView.indexPathForSelectedRow?
     // let rowSelected = indexPath!.row


        let destViewController: newController = segue.destination as! newController
        newController.rowSelected = rowSelected
    }

【讨论】:

  • 我试过了,但仍然在第二个 VC 中为 rowSelected 返回 0
  • 你调试过你的代码吗?使用断点。检查prepareForSegue中的rowSelected值
  • 如果不覆盖,您的代码将无法工作。另请参阅此答案stackoverflow.com/a/39563880/4803556
  • 实际上我的全部观点是他应该在全球范围内编写prepareForSegue。如果您编写 prepareForSegue 而不覆盖 xcode,则不会编译您的代码并给出错误来纠正它。是的,我错过了。谢谢
  • 好吧,只有覆盖那个人出错了,否则你就在那里并纠正了我对你的答案的看法。 @Sahil
【解决方案2】:

prepareForSegue时需要在函数中使用override

参见下面的示例代码:-

斯威夫特 3

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == "ShowAttractionDetails" {

       let detailViewController = segue.destination
            as! AttractionDetailViewController

       let myIndexPath = self.tableView.indexPathForSelectedRow!
       let row = myIndexPath.row
       detailViewController.webSite = webAddresses[row]
    }
}

斯威夫特 2.3

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
       if segue.identifier == "ShowAttractionDetails" {

           let detailViewController = segue.destination
                as! AttractionDetailViewController

           let myIndexPath = self.tableView.indexPathForSelectedRow!
           let row = myIndexPath.row
           detailViewController.webSite = webAddresses[row]
        }
    }

来源 - Segue from UITableViewCell Taps in Swift & TableView Navigation using Storyboards in Xcode 8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多