要获取Objective-c中的rootViewController,您可以使用以下代码行
[[[UIApplication sharedApplication] delegate] window].rootViewController
我试图在swift中做同样的事情
UIApplication.sharedApplication().delegate?.window?.rootViewController
但是我收到了这个错误
“的UIWindow?没有名为'rootViewController'的成员
并且建议说你必须两次打开UIWindow UIWindow??
才能
UIApplication.sharedApplication().delegate?.window??.rootViewController
我的问题是:为什么我需要打开窗口两次?
我查看了API并找到了
protocol UIApplicationDelegate : NSObjectProtocol {
optional var window: UIWindow? { get set }
}
该窗口有一个可选的
class UIWindow : UIView {
var rootViewController: UIViewController?
}
rootViewController还有一个可选的
我想可能是因为UIApplicationDelegate协议中的UIWindow有optional
和UIWindow?
所以我在Playground尝试了以下内容
@objc protocol MyApplicationDelegate {
optional var myWindow: MyWindow? { get set }
}
class MyWindow : NSObject {
var rootViewController: Int?
init(number: Int) {
rootViewController = number
}
}
class MyAppDelegate: MyApplicationDelegate {
var myWindow: MyWindow?
init() {
myWindow = MyWindow(number: 5)
}
}
let myDelegate = MyAppDelegate()
println(myDelegate.myWindow?.rootViewController)
但是我可以通过一个可选项获得myWindow
,并且可以成功记录“5”
我在这里缺少什么?
答案 0 :(得分:6)
好;我发现了我的例子
的问题在我的示例中,我直接从MyAppDelegate
创建对象,当我定义它时肯定会有myWindow
属性
将示例更改为以下
@objc protocol MyApplicationDelegate {
optional var myWindow: MyWindow? { get set }
}
class MyWindow : NSObject {
var rootViewController: Int?
init(number: Int) {
rootViewController = number
}
}
class MyAppDelegate: MyApplicationDelegate {
var myWindow: MyWindow?
init() {
myWindow = MyWindow(number: 5)
}
}
class MyApplication: NSObject {
var myDelegate: MyApplicationDelegate
override init() {
myDelegate = MyAppDelegate()
}
}
let myApplication = MyApplication()
println(myApplication.myDelegate.myWindow??.rootViewController)
我需要添加另一个具有符合MyApplication
MyApplicationDelegate
所以我能够使用 myWindow ?? 首先展开协议中的optional
部分,第二部分是变量UIWindow?
中的可选声明