使用 swift 中的快速操作快捷方式直接转到不同页面
go directly to different page using quick Action shortcut in swift
我的应用程序有 2 个页面 (VC),它们是在 BossPageViewController 中创建和控制的,我想为用户提供使用快捷方式操作直接转到第二页的选项。
现在我知道如何创建快捷方式以及如何触发它们,我也知道如何以 root 身份打开该页面但是当我以 root 身份打开它时我不再可以滑动到第一页而且 pageDots 也不存在所以我应该关闭应用程序和 运行 它再次能够在页面之间滑动并查看 pageDots。
下面的代码是第二页快捷方式触发的地方,我把整个sceneDelegate复制过去了,也许有人想测试一下:
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
}
//MARK:- Shortcuts are Triggered here.
func sceneDidBecomeActive(_ scene: UIScene) {
if let shortcutItem = shortcutItemManager {
if shortcutItem.type == "com.x.appname.openSecondPage" {
///- tag: code lines that run secondPage as root VC
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
window.rootViewController = storyboard.instantiateViewController(withIdentifier: "SecondPageVC")
self.window = window
window.makeKeyAndVisible()
}
shortcutItemManager = nil
}
}
}
}
我也不想将页面实例化为弹出窗口或模态窗口或其他任何内容,我的意思是只希望该页面保持原样,而不是该页面的副本。我的意思是复制的代码示例:
let openSecondPage = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "SecondPageVC") as! SecondPageViewController
window?.rootViewController?.present(openSecondPage, animated: false, completion: nil)
我已经搜索了一个月,但没有找到完全相同的东西,它们很相似,但他们的代码解决方案不适合我,这就是我这样做的原因post。
Swift 5.1
好的,通过针对不同的问题在 Whosebug 上发布的不同代码上进行混合和试错,最终我按照自己的意愿完成了这项工作,我认为最好分享它,因为我知道有人会需要它或可能有更好的方法可以与我们分享。
使用下面的代码触发快捷方式项目,或者如果您想 运行 在应用程序启动时使用它,请在 *****func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)***** 在 sceneDelegate 中。
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let bossPageVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "BossPageVCID") as! BossPageViewController
self.window = window
UIView.transition(with: window, duration: 0.1, options: .transitionCrossDissolve, animations: {
window.rootViewController = bossPageVC
window.makeKeyAndVisible()
}, completion: { completed in
// viewControllerPages is a viewController array I created in BossPageViewController and index of 1 means the second page
if let secondPage = bossPageVC.viewControllerPages[1]
bossPageVC.setViewControllers([secondPage], direction: .forward, animated: true, completion: nil)
})
}
我的应用程序有 2 个页面 (VC),它们是在 BossPageViewController 中创建和控制的,我想为用户提供使用快捷方式操作直接转到第二页的选项。 现在我知道如何创建快捷方式以及如何触发它们,我也知道如何以 root 身份打开该页面但是当我以 root 身份打开它时我不再可以滑动到第一页而且 pageDots 也不存在所以我应该关闭应用程序和 运行 它再次能够在页面之间滑动并查看 pageDots。
下面的代码是第二页快捷方式触发的地方,我把整个sceneDelegate复制过去了,也许有人想测试一下:
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
}
//MARK:- Shortcuts are Triggered here.
func sceneDidBecomeActive(_ scene: UIScene) {
if let shortcutItem = shortcutItemManager {
if shortcutItem.type == "com.x.appname.openSecondPage" {
///- tag: code lines that run secondPage as root VC
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
window.rootViewController = storyboard.instantiateViewController(withIdentifier: "SecondPageVC")
self.window = window
window.makeKeyAndVisible()
}
shortcutItemManager = nil
}
}
}
}
我也不想将页面实例化为弹出窗口或模态窗口或其他任何内容,我的意思是只希望该页面保持原样,而不是该页面的副本。我的意思是复制的代码示例:
let openSecondPage = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "SecondPageVC") as! SecondPageViewController
window?.rootViewController?.present(openSecondPage, animated: false, completion: nil)
我已经搜索了一个月,但没有找到完全相同的东西,它们很相似,但他们的代码解决方案不适合我,这就是我这样做的原因post。
Swift 5.1
好的,通过针对不同的问题在 Whosebug 上发布的不同代码上进行混合和试错,最终我按照自己的意愿完成了这项工作,我认为最好分享它,因为我知道有人会需要它或可能有更好的方法可以与我们分享。
使用下面的代码触发快捷方式项目,或者如果您想 运行 在应用程序启动时使用它,请在 *****func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)***** 在 sceneDelegate 中。
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let bossPageVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "BossPageVCID") as! BossPageViewController
self.window = window
UIView.transition(with: window, duration: 0.1, options: .transitionCrossDissolve, animations: {
window.rootViewController = bossPageVC
window.makeKeyAndVisible()
}, completion: { completed in
// viewControllerPages is a viewController array I created in BossPageViewController and index of 1 means the second page
if let secondPage = bossPageVC.viewControllerPages[1]
bossPageVC.setViewControllers([secondPage], direction: .forward, animated: true, completion: nil)
})
}