我正在开发一个应用程序,并且想在特定位置重设根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)
}
}
其他部分对我来说很好。