【问题标题】:Is it possible to pass a enum through segue in swift是否可以通过 segue 快速传递枚举
【发布时间】:2015-12-08 16:58:09
【问题描述】:

我的第一个 ViewController 中有这个 prepareForSegue,里面有一个枚举

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    enum TypeOfSegue {
        case Edit, Create
    }

    if let DestViewController: DetailViewController = segue.destinationViewController as? DetailViewController where segue.identifier == "EditItem" {
        let edit = TypeOfSegue.Edit

    }
    if let DestViewController: DetailViewController = segue.destinationViewController as? DetailViewController where segue.identifier == "CreateNewItem" {
        let create = TypeOfSegue.Create

    }
}

我想将常量编辑或创建传递给我的 DetailViewController。如果可能的话,我该怎么做?TypeOfSegue 将保存在 DetailViewController 中的哪个变量下?

【问题讨论】:

  • prepareForSegue 中的可选绑定是糟糕的设计,因为你——开发者——应该从你的故事板中准确地知道 segue 的数量、目标控制器的类和字符串标识符,所以它们永远不会是 @ 987654323@。 switch segue.identifier { .. } 表达式更有效。

标签: ios swift enums


【解决方案1】:

您可以在 DetailViewController 中定义模式属性

class DetailViewController:UIViewController {    
    var mode: TypeOfSegue!
}

接下来你可以填充它

enum TypeOfSegue {
    case Edit, Create
}
class ListViewController:UIViewController {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let destViewController: DetailViewController = segue.destinationViewController as? DetailViewController where segue.identifier == "EditItem" {
            destViewController.mode = .Edit
        }
        if let destViewController: DetailViewController = segue.destinationViewController as? DetailViewController where segue.identifier == "CreateNewItem" {
            destViewController.mode = .Create
        }
    }
}

更新

你也可以这样实现prepareForSegue方法

enum TypeOfSegue: String, CustomStringConvertible {
    case Edit = "EditItem", Create = "CreateNewItem"
    var description: String { return self.rawValue }
}

class ListViewController:UIViewController {
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        guard let
            destViewController = segue.destinationViewController as? DetailViewController,
            identifier = segue.identifier,
            segueType = TypeOfSegue(rawValue: identifier) else { fatalError("Wrong segue") }
        destViewController.mode = segueType
    }
}

【讨论】:

  • 为了使rawValue: 方法起作用,您不需要为 TypeOfSegue 枚举定义原始值吗?
  • @MikeAtNobel:你说得对,我忘了粘贴更新后的枚举定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多