无法将 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)
}