无法将 Storyboard 中的 viewController 实例化为 swift 中的 rootViewController
Unable to instantiate a viewController from Storyboard as rootViewController in swift
作为 swift 的新手,我正在尝试使用故事板使用以下代码转到 LoginController
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
var type = UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound;
var setting = UIUserNotificationSettings(forTypes: type, categories: nil);
UIApplication.sharedApplication().registerUserNotificationSettings(setting);
UIApplication.sharedApplication().registerForRemoteNotifications();
var navCtrl = UINavigationController();
var isLoggedIn = NSUserDefaults.standardUserDefaults().boolForKey(USERDEFAULT_ISLOGGEDIN);
if(isLoggedIn)
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: CategoriesController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_CATEGORIES) as CategoriesController
navCtrl.pushViewController(mainController, animated: true);
}
else
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: LoginController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_LOGIN) as LoginController
navCtrl.pushViewController(mainController, animated: true);
}
self.window?.rootViewController = navCtrl;
self.window?.makeKeyAndVisible();
return true
}
然而它只是显示空白屏幕。将 navController 指定为 rootViewController 有什么问题?
您尚未创建 window,因此 self.window
将为零。仅当您从 xib 或故事板启动应用程序时,系统才会创建 window。如果您不使用这些,则必须自己创建。
由于您使用 ?
有条件地解包,因此根本不会执行 navCtrl 的分配和对 makeKeyAndVisible() 的调用。
在使用之前简单地创建一个 UIWindow:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// ...
self.window!.rootViewController = navCtrl;
self.window!.makeKeyAndVisible();
return true
}
我建议用 !
解开所有涉及 window
的调用。没有 window 应该是一个错误。
试试这个方法。我认为你不能推送 UINavigationController 直到你设置它的根 ViewController.
var navCtrl
let isLoggedIn = NSUserDefaults.standardUserDefaults().boolForKey(USERDEFAULT_ISLOGGEDIN);
if (isLoggedIn)
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: CategoriesController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_CATEGORIES) as CategoriesController
navCtrl = UINavigationController(rootViewController:mainController)
}
else
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: LoginController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_LOGIN) as LoginController
navCtrl = UINavigationController(rootViewController:mainController)
}
作为 swift 的新手,我正在尝试使用故事板使用以下代码转到 LoginController
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
var type = UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound;
var setting = UIUserNotificationSettings(forTypes: type, categories: nil);
UIApplication.sharedApplication().registerUserNotificationSettings(setting);
UIApplication.sharedApplication().registerForRemoteNotifications();
var navCtrl = UINavigationController();
var isLoggedIn = NSUserDefaults.standardUserDefaults().boolForKey(USERDEFAULT_ISLOGGEDIN);
if(isLoggedIn)
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: CategoriesController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_CATEGORIES) as CategoriesController
navCtrl.pushViewController(mainController, animated: true);
}
else
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: LoginController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_LOGIN) as LoginController
navCtrl.pushViewController(mainController, animated: true);
}
self.window?.rootViewController = navCtrl;
self.window?.makeKeyAndVisible();
return true
}
然而它只是显示空白屏幕。将 navController 指定为 rootViewController 有什么问题?
您尚未创建 window,因此 self.window
将为零。仅当您从 xib 或故事板启动应用程序时,系统才会创建 window。如果您不使用这些,则必须自己创建。
由于您使用 ?
有条件地解包,因此根本不会执行 navCtrl 的分配和对 makeKeyAndVisible() 的调用。
在使用之前简单地创建一个 UIWindow:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// ...
self.window!.rootViewController = navCtrl;
self.window!.makeKeyAndVisible();
return true
}
我建议用 !
解开所有涉及 window
的调用。没有 window 应该是一个错误。
试试这个方法。我认为你不能推送 UINavigationController 直到你设置它的根 ViewController.
var navCtrl
let isLoggedIn = NSUserDefaults.standardUserDefaults().boolForKey(USERDEFAULT_ISLOGGEDIN);
if (isLoggedIn)
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: CategoriesController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_CATEGORIES) as CategoriesController
navCtrl = UINavigationController(rootViewController:mainController)
}
else
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var mainController: LoginController = mainStoryboard.instantiateViewControllerWithIdentifier(SEGUE_LOGIN) as LoginController
navCtrl = UINavigationController(rootViewController:mainController)
}