Swift中通过Quick Action快捷方式跳转至PageViewController指定页面
Fix: Jump to Second Page Without Losing Page Controller Functionality
Got it, let's solve this without breaking your BossPageViewController's swipe and page dot features. The core issue right now is that replacing the root view controller discards your existing page controller instance entirely. Instead, we need to access the already-loaded page controller and tell it to navigate to the second page directly.
Here's how to revise your SceneDelegate code:
import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? var shortcutItemManager: UIApplicationShortcutItem? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { if let shortcutItem = connectionOptions.shortcutItem { shortcutItemManager = shortcutItem } guard let _ = (scene as? UIWindowScene) else { return } } func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { shortcutItemManager = shortcutItem completionHandler(true) // Critical: Let iOS know we handled the shortcut } func sceneDidBecomeActive(_ scene: UIScene) { guard let shortcutItem = shortcutItemManager, shortcutItem.type == "com.x.appname.openSecondPage" else { return } // Grab the existing BossPageViewController (don't create a new one!) guard let pageController = window?.rootViewController as? BossPageViewController else { print("Couldn't access the existing BossPageViewController") shortcutItemManager = nil return } // Fetch the second page VC from your storyboard (reuse your existing identifier) let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let secondPageVC = storyboard.instantiateViewController(withIdentifier: "SecondPageVC") as? SecondPageViewController else { print("Failed to load SecondPageVC from storyboard") shortcutItemManager = nil return } // Tell the page controller to switch to the second page // Adjust this line based on how your BossPageViewController manages pages: // If it's a UIPageViewController subclass, use setViewControllers: pageController.setViewControllers([secondPageVC], direction: .forward, animated: true, completion: nil) // If you have a custom page tracking system, add a public method to BossPageViewController like this: // pageController.jumpToPage(atIndex: 1) shortcutItemManager = nil } }
Key Improvements & Next Steps:
- Keep your root VC intact: By using the existing
BossPageViewController, you preserve all its built-in swipe gestures, page dots, and state. - Add a custom page-jump method (optional but cleaner): If your
BossPageViewControllertracks pages with an array, add a public helper method to make navigation more maintainable. For example:class BossPageViewController: UIPageViewController { // Assume you store your VCs in this array private var pageViewControllers: [UIViewController] = [] // Public method to jump directly to a page index func jumpToPage(atIndex index: Int) { guard index >= 0 && index < pageViewControllers.count else { return } let direction: UIPageViewController.NavigationDirection = index > currentPageIndex ? .forward : .reverse setViewControllers([pageViewControllers[index]], direction: direction, animated: true, completion: nil) } // Helper to get the current page index private var currentPageIndex: Int { guard let currentVC = viewControllers?.first, let index = pageViewControllers.firstIndex(of: currentVC) else { return 0 } return index } } - Confirm shortcut handling: Always call
completionHandler(true)inperformActionForto let iOS know the shortcut was processed successfully.
This approach maintains your app's existing navigation flow while letting users jump straight to the second page via the shortcut.
内容的提问来源于stack exchange,提问作者Developersian
相关产品推荐
相关产品推荐

