在 Swift 中从 AppDelegate 解开 UIWindow 两次

Posted

技术标签:

【中文标题】在 Swift 中从 AppDelegate 解开 UIWindow 两次【英文标题】:Unwrap UIWindow twice from AppDelegate in Swift 【发布时间】:2014-10-05 09:44:26 【问题描述】:

要在 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】:

好吧;我发现我的例子有问题

在我的示例中,我直接从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? 中的可选声明

【讨论】:

以上是关于在 Swift 中从 AppDelegate 解开 UIWindow 两次的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从 AppDelegate 加载嵌入到 UINavigationController 的控制器

何在混合应用程序(主要语言 ObjC)中从 Swift 获取对 appdelegate 的引用以避免引用循环

在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil

在 iOS 中从 AppDelegate 获取数据到 ViewController

在 Xcode 11.5 中从 AppDelegate 访问 ViewController(firebase google 登录)

如何在 iOS 中从 AppDelegate 调用视图控制器