在 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 有 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'
我在这里错过了什么?
【问题讨论】:
【参考方案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 登录)