【问题标题】:perform segue and send tuple as sender执行 segue 并将元组作为发件人发送
【发布时间】:2016-11-12 00:39:15
【问题描述】:

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

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

但在 override func prepare(for segue: UIStoryboardSegue, sender: Any?) 内部,当我尝试将发件人转换为 (String, String) 时,我遇到了转换异常

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

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

有其他人经历过吗?

【问题讨论】:

    标签: ios swift swift3 segue uistoryboardsegue


    【解决方案1】:

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

    无论如何,为了回答你的问题,这是你如何从 Any 中回退的?到 (String, String) 的元组

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

    【讨论】:

    • 我见过几个例子,人们使用 sender 来传递数据。无论如何,这是另一个讨论。只是想知道为什么我在 prepareForSegue 中收到的发件人不是我原来的元组。自己试试吧。
    • 使用sender传递数据没有问题,但很少有使用元组的好理由。使用结构或对象
    • @Paulw11 为什么没有理由使用元组?元组是任何类型的,对吗?我想知道,因为苹果的 performSegue 和 prepareForSegue API 可能需要更新。
    • 因为元组没有正式的类型或参数名称;它们是非结构化的。如果你的类型有结构,你的代码会更可靠
    • 元组可以有参数名称,它们只是可选的。无论如何,这也不是我原来的帖子的内容。这就是为什么我不能从发件人那里投射我的元组。
    【解决方案2】:

    即使参数 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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2021-07-29
      • 2019-04-06
      相关资源
      最近更新 更多