在 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 变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Vue js 的 v-for 循环中使用 v-model
如何在 vuetify 标签 <v-icon></v-icon> 中使用圆形图标?
如果使用 Vuetify 在 v-for 中使用 v-checkbox 进行其他条件