从Swift中的AppDelegate中解开UIWindow两次

时间:2014-10-05 09:44:26

标签: objective-c swift appdelegate uiwindow

要获取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有optionalUIWindow?所以我在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”

我在这里缺少什么?

1 个答案:

答案 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?中的可选声明