执行 segue 并作为发件人发送元组

perform segue and send tuple as sender

我一直在尝试在执行 segue 时为发送者对象设置一个元组,例如:

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

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

时出现转换异常

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

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

有没有其他人遇到过这种情况?

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

总之,为了回答您的问题,您是如何从 Any 中回退的?到 (String, String)

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

即使参数 sender 不应该用于传递任何数据或者这可能不是一个好的做法,我发现它有用且干净。我认为如果它简短而简单,它不会让工作团队的人感到困惑。我认为 Apple 的 API 以某种方式获得 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)
        }
    }
}