在 segue.destination 中使用 ViewController 变量

Posted

技术标签:

【中文标题】在 segue.destination 中使用 ViewController 变量【英文标题】:Using a ViewController variable in segue.destination 【发布时间】:2018-06-11 15:52:38 【问题描述】:

在下面的代码中,我尝试使用变量controller 在底部填写我的目标segue 的类型。但相反,我收到一条错误消息,指出 controller 未声明。它就在第二行声明!我能看到它!我意识到使用 segue 标识符有很多替代方法,但我更感兴趣的是了解为什么这不起作用。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    var controller: UIViewController

    switch segue.identifier 
    case "ASegue":
        controller = AViewController()
    case "BSegue":
        controller = BViewController()
    case "CSegue":
        controller = CViewController()
    default:
        controller = AViewController()
    

    if let vc = segue.destination as? controller  //Use of undeclared type 'controller'
        ...
    

【问题讨论】:

controller 不是类型。这是一个实例(无缘无故愚蠢地创建)。这个开关的整个结构是错误的。您大概知道基于 segue 的控制器类型,所以只需转换! controller 包含视图控制器的实例,而不是它的类型。这是一个很好的例子,为什么类型应该大写而实例小写。你要完成什么?如果控制器是在 Interface Builder 中设计的,则默认初始化程序 AViewController() 无论如何都不起作用。 我有六种可能的segues,每个segues的代码都是相同的,除了视图控制器的类型。在我的案例陈述中重复这么多似乎是个坏主意,所以我试图稍微浓缩一下。如果我知道我很愚蠢,我可能一开始就不会来到这里。我现在明白 Swift 是一种静态类型语言,编译器需要知道类型才能运行程序。 如果每个目标视图控制器中都有一个公共属性,则根据要求创建一个具有该属性的协议并采用该协议。那么你只需要一次 if let vc = segue.destination as? MyControllerProtocol 我不得不将 if let vc 更改为 if var vc 但否则它工作了!太棒了,谢谢!! 【参考方案1】:

强制转换必须是类型(字面量),而不是变量

而且在任何情况下,您都不能像您希望的那样将所有操作合并到一个 controller 变量中,因为它们不同的类型。

因此,您只需将转换移动到 switch 的每个 case 中,转换为您期望该 segue 的目标控制器的类型,并在 that controller in 那个案例:

switch segue.identifier 
case "ASegue":
    if let controller = segue.destination as? AViewController 
        // do stuff
    
case "BSegue":
    if let controller = segue.destination as? BViewController 
// etc.

也许一种更简洁的表达方式是忘记标识符并只使用视图控制器类,如果每个可能的segue都有不同的视图控制器类:

switch segue.destination 
case let controller as AViewController:
    // populate controller
case let controller as BViewController:
    // populate controller
// etc.

【讨论】:

以上是关于在 segue.destination 中使用 ViewController 变量的主要内容,如果未能解决你的问题,请参考以下文章

在 v-for 中的 v:bind 中使用动态名称

如何在 Vue js 的 v-for 循环中使用 v-model

如何在 vuetify 标签 <v-icon></v-icon> 中使用圆形图标?

如果使用 Vuetify 在 v-for 中使用 v-checkbox 进行其他条件

在 vue 项目中,v-for 的时候使用 v-model 快捷绑定变量

在 Vue.js 中使用 V-for 和 V-if 在条件下显示 JSON 数据