如何使用 prepareForSegue 从二维数组传递值

Posted

技术标签:

【中文标题】如何使用 prepareForSegue 从二维数组传递值【英文标题】:How to pass value from 2d array with prepareForSegue 【发布时间】:2018-08-08 06:14:10 【问题描述】:

我在tableView 中有一个这样的数组:

var array: [[String]] = [["Apples", "Bananas", "Oranges"], ["Round", "Curved", "Round"]]

我想在按下单元格时传递单元格的名称。使用标准数组我会这样做:

 let InfoSegueIdentifier = "ToInfoSegue"

    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    
        if segue.identifier == InfoSegueIdentifier
        
            let destination = segue.destination as! InfoViewController
            let arrayIndex = tableView.indexPathForSelectedRow?.row
            destination.name = nameArray[arrayIndex!]
          
        

在接下来的ViewController (InfoViewController)

var name = String()


    override func viewDidLoad() 
        super.viewDidLoad()
nameLabel.text = name
        

错误:“无法将类型 '[String]' 的值分配给类型 'String'”

【问题讨论】:

你想在 nameLabel.text 中存储什么? 你定义的'array'是数组里面的字符串数组,所以这个错误肯定会出现。 【参考方案1】:

修改这部分代码

if segue.identifier == InfoSegueIdentifier

     let destination = segue.destination as! InfoViewController
     let arrayIndex = tableView.indexPathForSelectedRow?.row
     destination.name = nameArray[arrayIndex!]

if segue.identifier == InfoSegueIdentifier

   let destination = segue.destination as! InfoViewController
   let arrayIndexRow = tableView.indexPathForSelectedRow?.row
   let arrayIndexSection = tableView.indexPathForSelectedRow?.section
   destination.name = nameArray[arrayIndexSection!][arrayIndexRow!]
 

尝试并分享结果。

崩溃原因:在您的第一个 viewController 中,您有 [[String]],这是您的部分的数据源。现在,当您尝试从该数组中获取对象时,它会返回 [String] 并且在您的目标 viewController 中您拥有 String 类型的对象。并且在将 [String] 分配给 String 时,它会导致类型不匹配的崩溃。所以,上面代码的作用是,首先从 arrayIndexSection 获取 [String],然后从 arrayIndexRow 获取 String strong> 并因此将 String 对象传递到目的地。

希望它清除。

【讨论】:

【参考方案2】:

您收到此错误是因为您将数组传递给第二个视图控制器并且有一个字符串类型的变量。所以,像这样替换这个方法。

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    
        if segue.identifier == InfoSegueIdentifier
        
            let destination = segue.destination as! InfoViewController
            if let indexPath = tableView.indexPathForSelectedRow
                 destination.name = nameArray[indexPath.section][indexPath.row]
            

        
      

【讨论】:

以上是关于如何使用 prepareForSegue 从二维数组传递值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 prepareForSegue 从 UIButton 传递字符串

从最初的 View Controller 如何将 acriss 转移到 UITabBarController 并使用 prepareForSegue

如何使用 prepareForSegue 方法从视图控制器推送到导航视图控制器?

如何从 prepareForSegue 调用“自我”属性:?

使用导航控制器在“prepareForSegue”中设置数据

如何从文件中读取二维数组的元素数?