RootViewController 不是从 AppDelegate 设置的吗?
RootViewController not being set from AppDelegate?
我正在使用一个归档对象来确定哪个视图需要在启动时加载(或者只是从睡眠中打开应用程序),带有布尔标志。尽管我的 if 语句评估正确,但其中的代码却没有。
这是 didFinishLaunchingWithOptions 中的内容:
// Register permission to throw notifications
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert | .Badge | .Sound, categories: nil))
var so = StatusOverseer.sharedOverseer
println("User did finish application: \(so.userDidFinishApplication)")
println("Banks Did Respond: \(so.banksDidRespond)")
println("user did accept terms: \(so.userDidAcceptTerms)")
// Decide whether or not to present the waiting view
if so.userDidFinishApplication && !so.banksDidRespond {
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewControllerWithIdentifier("submitWaiting") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
else if so.banksDidRespond {
println("bip")
let sb = UIStoryboard(name: "Main", bundle: nil)
if so.notificationWasGood {
let vc = sb.instantiateViewControllerWithIdentifier("approved") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
else {
let vc = sb.instantiateViewControllerWithIdentifier("notApproved") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
}
else if so.userDidAcceptTerms {
println("Did Run")
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewControllerWithIdentifier("LicenseViewNav") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
控制台输出如下:
Recalling Status Overseer from Archive...
User did finish application: false
Banks Did Respond: false
user did accept terms: true
Did Run
请注意,底部 else if
运行 是预期的,但我在启动时看到的视图不是 LicenseViewNav
中声明的行:
let vc = sb.instantiateViewControllerWithIdentifier("LicenseViewNav") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
如果有人知道发生了什么,那就太好了。谢谢!
编辑:当前问题似乎是 keyWindow
的计算结果为 nil
在 swift
中设置根视图控制器的最佳方式
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
var rootView: MyRootViewController = MyRootViewController()
if let window = self.window{
window.rootViewController = rootView
}
return true
}
通过强制 keyWindow 初始化,这是一个简单的修复。我只是把这一行放在我的 if 语句上面,它现在可以工作了。
window?.makeKeyAndVisible()
我正在使用一个归档对象来确定哪个视图需要在启动时加载(或者只是从睡眠中打开应用程序),带有布尔标志。尽管我的 if 语句评估正确,但其中的代码却没有。
这是 didFinishLaunchingWithOptions 中的内容:
// Register permission to throw notifications
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert | .Badge | .Sound, categories: nil))
var so = StatusOverseer.sharedOverseer
println("User did finish application: \(so.userDidFinishApplication)")
println("Banks Did Respond: \(so.banksDidRespond)")
println("user did accept terms: \(so.userDidAcceptTerms)")
// Decide whether or not to present the waiting view
if so.userDidFinishApplication && !so.banksDidRespond {
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewControllerWithIdentifier("submitWaiting") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
else if so.banksDidRespond {
println("bip")
let sb = UIStoryboard(name: "Main", bundle: nil)
if so.notificationWasGood {
let vc = sb.instantiateViewControllerWithIdentifier("approved") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
else {
let vc = sb.instantiateViewControllerWithIdentifier("notApproved") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
}
else if so.userDidAcceptTerms {
println("Did Run")
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewControllerWithIdentifier("LicenseViewNav") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
}
控制台输出如下:
Recalling Status Overseer from Archive...
User did finish application: false
Banks Did Respond: false
user did accept terms: true
Did Run
请注意,底部 else if
运行 是预期的,但我在启动时看到的视图不是 LicenseViewNav
中声明的行:
let vc = sb.instantiateViewControllerWithIdentifier("LicenseViewNav") as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
如果有人知道发生了什么,那就太好了。谢谢!
编辑:当前问题似乎是 keyWindow
的计算结果为 nil
在 swift
中设置根视图控制器的最佳方式func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
var rootView: MyRootViewController = MyRootViewController()
if let window = self.window{
window.rootViewController = rootView
}
return true
}
通过强制 keyWindow 初始化,这是一个简单的修复。我只是把这一行放在我的 if 语句上面,它现在可以工作了。
window?.makeKeyAndVisible()