rootViewController在iOS 13.0,Xcode 11.2.1,Swift 5

时间:2019-11-27 11:11:26

标签: ios swift xcode rootviewcontroller uiscenedelegate

我正在开发一个应用程序,并且想在特定位置重设根ViewController。因此,我在AppDelegate类中创建了一个方法来更新RootViewController。

extension AppDelegate{
    func setStoryboard(name:String, controllerIdentifier:String){
        let storyBoard : UIStoryboard = UIStoryboard(name: name, bundle:nil)
        let controller = storyBoard.instantiateViewController(withIdentifier: controllerIdentifier)
        let navigationController = UINavigationController(rootViewController: controller)
        navigationController.setNavigationBarHidden(true, animated: false)
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window!.rootViewController = navigationController
    } }

这对我来说很好,但是每当我在装有iOS 13.0的模拟器上运行应用程序时,由于appDelegate.window!.rootViewController = navigationController导致window的应用程序在nil上崩溃。我们在iOS 13.0中知道AppDelegae类没有window属性,它移到了SceneDelegate类中。

因此,我在SceneDelegate类的扩展中创建了一个新方法,如下所示。

@available(iOS 13.0, *)
extension SceneDelegate{
    func setStoryboard(name:String, controllerIdentifier:String){
        self.window = UIWindow(frame: UIScreen.main.bounds)
        let storyBoard : UIStoryboard = UIStoryboard(name: name, bundle:nil)
        let controller = storyBoard.instantiateViewController(withIdentifier: controllerIdentifier)
        let navigationController = UINavigationController(rootViewController: controller)
        navigationController.setNavigationBarHidden(true, animated: false)
        self.window!.rootViewController = navigationController
        self.window!.makeKeyAndVisible()
    }
}

现在我的应用程序不再崩溃。很好,但是我的rootViewController也没有得到更新。

请让我知道我在SceneDelegate课堂上做错了什么。我正在获取窗口,但是rootViewController尚未更新。

我正在按如下方式调用我的方法。

@IBAction func btn_Close_Tapped(_ sender: UIButton) {
        if #available(iOS 13.0, *) {
            SceneDelegate.shared.setStoryboard(name: STORYBOARDS_NAME.HOME.rawValue, controllerIdentifier: IDENTIFIRES.HOME_TABBAR.rawValue)
        } else {
            AppDelegate.shared.setStoryboard(name: STORYBOARDS_NAME.HOME.rawValue, controllerIdentifier: IDENTIFIRES.HOME_TABBAR.rawValue)
        }
    }

其他部分对我来说很好。

0 个答案:

没有答案