我正在尝试弄清楚委托和协议,并学习教程。它有以下代码:
class SelectTimeViewController: UIViewController, PopupDelegate{
...
let sb = UIStoryboard(name: "DatePopupViewController", bundle: nil)
let popup = sb.instantiateInitialViewController() as! DatePopupViewController
popup.delegate = self
…
}
代码中的这一行是什么意思?
let popup = sb.instantiateInitialViewController() as! DatePopupViewController
我知道这里我们创建了一个弹出窗口常量并为其赋值,然后将其转换为DatePopupViewController类。
但这更普遍地意味着什么呢?
1.我们是否创建了DatePopupViewController类的示例?
1.我们是否将DatePopupViewController类中的任何值分配给let弹出窗口?
1.我们是否创建了DatePopupViewController类的副本?
更新:关于#1。
通常,当我们创建一个类的示例时,我们使用以下语法:
constant (or variable) = ClassName (initializer)
例如:
var item = Item(name: "Car")
在这个例子中,语法是不同的。我们没有初始化器(括号)。
let popup = ... DatePopupViewController
在这种情况下,我们可以说已经在这里创建了类的示例吗?
1条答案
按热度按时间dgjrabp21#
您的故事板有一个或多个场景。每个场景都由一个view controller管理。通常您会为每个场景创建一个自定义的
UIViewController
子类。在故事板编辑器中,为每个场景键入该自定义类的名称。故事板中的一个场景可以标记为“初始场景”。
UIStoryboard
有一个方法instantiateInitialViewController
,可以从故事板中加载该场景。但是世界上有很多很多故事板,它们使用很多不同的自定义
UIViewController
子类作为场景。你甚至可以在一个应用程序中有多个故事板,每个故事板都有一个使用不同自定义子类的初始场景。在编译时,
UIStoryboard
无法知道instantiateInitialViewController
要加载什么类,它只知道要加载UIViewController
,或者UIViewController
的子类,所以instantiateInitialViewController
声明为返回UIViewController
。但是当你写代码的时候,你通常知道它要加载哪个子类,而且你经常想做一些依赖于子类的事情。在你发布的代码中,你设置了一个名为
delegate
的属性,这是一个特定于DatePopupViewController
的属性,而不是UIViewController
的属性。为了访问
delegate
属性,你需要告诉Swift你所知道的Swift还不知道的东西,你需要告诉Swift你正在加载一个DatePopupViewController
,你可以使用一个名为“cast”的语法来完成这个任务: