一、SceneDelegate与AppDelegate
在从iOS 13开始,苹果引入了SceneDelegate来管理多个场景。与此同时,AppDelegate的角色变成了应用程序生命周期的管理者,SceneDelegate则负责管理每个场景的生命周期。
AppDelegate是整个应用程序的入口,当应用程序启动时,会先调用AppDelegate里的函数。然后,当需要创建Scene时,就会创建一个新的代表当前场景的SceneDelegate。换句话说,SceneDelegate是与场景相关的,而AppDelegate是与整个应用程序相关的。
二、SceneDelegate调用其他控制器函数
SceneDelegate可以与其他控制器进行交互,调用它们的函数,来完成一些事情。
下面是一个例子,当某个用户点击了一个菜单按钮,就会出现一个选项卡视图。在这个过程中,SceneDelegate需要调用UITabBarController的present函数来打开选项卡视图。
import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? var tabBarController: UITabBarController? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) tabBarController = UITabBarController() let firstViewController = UIViewController() let secondViewController = UIViewController() tabBarController?.viewControllers = [firstViewController, secondViewController] window.rootViewController = tabBarController self.window = window window.makeKeyAndVisible() } func sceneDidDisconnect(_ scene: UIScene) { } func sceneDidBecomeActive(_ scene: UIScene) { } func sceneWillResignActive(_ scene: UIScene) { } func sceneWillEnterForeground(_ scene: UIScene) { } func sceneDidEnterBackground(_ scene: UIScene) { } func presentFilterMenu() { guard let tabBarController = self.tabBarController else { return } let filterViewController = FilterViewController() let navigationController = UINavigationController(rootViewController: filterViewController) navigationController.modalPresentationStyle = .overFullScreen tabBarController.present(navigationController, animated: true, completion: nil) } }
在上面的代码中,我们在SceneDelegate里创建了一个UITabBarController,并把两个UIViewController作为其子视图控制器。当我们需要打开选项卡视图时,在SceneDelegate里调用了presentFilterMenu函数,这个函数会创建FilterViewController,然后用UINavigationController包装一下,最后调用UITabBarController的present函数来打开选项卡视图。
三、SceneDelegate相比AppDelegate的优势
使用SceneDelegate,我们可以更好地管理多个场景。在iOS 13之前,每个应用程序只有一个AppDelegate,而现在,一个应用程序可以拥有多个SceneDelegate。我们可以让每个SceneDelegate只关心其自身的逻辑,而不必把所有的逻辑都放在一个AppDelegate里处理。
如果我们有一个包含多个视图控制器的场景,而这些视图控制器都需要进行网络请求,我们可以把网络请求相关的代码放在一个网络请求管理器中。然后,我们可以在每个视图控制器中调用这个网络请求管理器,并让SceneDelegate来初始化它。
import UIKit class NetworkManager { static let shared = NetworkManager() func fetchData() { ... } } class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? var tabBarController: UITabBarController? var networkManager: NetworkManager? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) tabBarController = UITabBarController() let firstViewController = ViewController() let secondViewController = ViewController() networkManager = NetworkManager.shared firstViewController.networkManager = networkManager secondViewController.networkManager = networkManager tabBarController?.viewControllers = [firstViewController, secondViewController] window.rootViewController = tabBarController self.window = window window.makeKeyAndVisible() } }
在上面的代码中,我们创建了一个NetworkManager,这是一个用来管理网络请求的类。我们在SceneDelegate里初始化了这个NetworkManager,然后在每个ViewController中调用。
四、结语
在本文中,我们详细介绍了SceneDelegate的作用和优势,以及如何在SceneDelegate中调用其他控制器函数。SceneDelegate管理多个场景,使得应用程序变得更加灵活和易于维护。通过SceneDelegate,我们可以实现更好的代码隔离和逻辑分离。
原创文章,作者:XKRL,如若转载,请注明出处:https://www.506064.com/n/144561.html