如何使用prepareForSegue从2D数组传递值

时间:2018-08-08 06:14:10

标签: arrays swift uitableview segue

我在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!]
          }
    }    

然后在下一个ViewControllerInfoViewController

var name = String()


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

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

2 个答案:

答案 0 :(得分:0)

更改这部分代码

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对象传递到目的地。

希望它清除。

答案 1 :(得分:0)

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

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]
            }

        }
    }