执行segue并发送元组作为发送者

时间:2016-11-12 00:39:15

标签: ios swift swift3 segue uistoryboardsegue

我在尝试执行segue时尝试将一个元组设置为sender对象:

performSegue(withIdentifier: "", sender: ("hello", "hello2"))

但是在override func prepare(for segue: UIStoryboardSegue, sender: Any?)内部我尝试将发件人转换为(String, String)

时会遇到强制转换异常

似乎只有元组的第一个元素在sender

我希望发件人的类型为Any?,我可以使用元组作为变量吗?

还有其他人经历过这个吗?

2 个答案:

答案 0 :(得分:2)

根据documentation,发件人应该是发起segue的对象;这不是您填充数据传递到目标viewcontroller的地方。相反,您应该将它放在视图控制器的属性中,然后使用它在prepareForSegue中设置目标视图控制器的属性。

无论如何,要回答你的问题,这是你如何从Any回来的?到(String,String)元组

let b = ("g", "f")
let a: Any? = b
if let c = a as? (String, String) {
    print (c)
}

答案 1 :(得分:1)

即使参数发送者不应该被用来传递任何数据,或者它可能不是一个好习惯,我发现它很有用且干净。如果简短而简单的话,我认为它不会让工作团队的人感到困惑。我认为Apple的某种方式可以像Obj-C那样对待它。

我已经尝试了一些方法来传递它并找到我使用的方式:

在数组中:

    let tuple = ("string1", "string2")
    performSegue(withIdentifier: "theSegue", sender: [tuple])

所以你得到:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let data = sender as? [Any] {
        if let first = data.first {
            print(first)
        }
    }
}

或者作为字典:

    let tuple = ("string1", "string2")
    performSegue(withIdentifier: "theSegue", sender: ["userInfo":tuple])

所以你得到:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let data = sender as? [String:Any] {
        if let userInfo = data["userInfo"] {
            print(userInfo)
        }
    }
}