选项卡视图的 3D 触摸快捷方式,然后执行 segue
3D touch shortcut to a tab view and then performing a segue
我在应用程序中使用 3D 触摸快捷方式时遇到问题。我的应用程序使用选项卡,但我想将用户重定向到一个选项卡,然后在他们按下创建愿望列表按钮时也重定向到另一个 segue。
Here is a picture of my storyboard.
我目前使用的代码显示主视图控制器,但我希望它进入创建愿望列表控制器。
我在应用程序委托中的句柄快捷方式代码在这里:
func handleShortcut( shortcutItem:UIApplicationShortcutItem ) -> Bool {
print("Handling shortcut")
var succeeded = false
if( shortcutItem.type == "com.example.Giftr" ) {
print("- Handling \(shortcutItem.type)")
if let tabVC = self.window?.rootViewController as? UITabBarController{
tabVC.selectedIndex = 1
//This is where I need to swap to the "createwishlist" view controller.
}
这应该可以在您成功切换标签后将 ViewController 更改为您想要的 class。
let vc = ViewController() //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)
为了解决这个问题,我使用了一个全局变量来存储快捷方式已在 appDelegate 中使用,如下所示。
GlobalVars.shortcut = 1
let tabVC = window?.rootViewController as! UITabBarController
print(tabVC.self)
tabVC.selectedIndex = 0
然后在 selectedIndex 0 选项卡的控制器内部检查该值是否为 1,然后它是否被转到我想要结束的视图控制器。如图所示。
override func viewDidAppear(animated: Bool) {
if(GlobalVars.shortcut == 1)
{
self.performSegueWithIdentifier("shortcut", sender: self)
GlobalVars.shortcut = 0
}
}
确保将全局变量设置为 0,否则每次出现视图时都会调用它。
我会使用 NotificationCenter。假设您的应用程序自然启动到 HomeViewController,它恰好是主选项卡栏控制器的第一个 VC,并且您想要定义 "New Post" 快捷方式项,以便在加载 HomeViewController 后立即执行转到 NewPostViewController。
首先,定义通知名称:
extension Notification.Name {
Notification.Name("applicationLaunchedWithNewPostShortcutItem")
}
其次,post应用程序启动时的快捷方式通知(我假设它是第一个静态快捷方式项目):
func handleShortCutItem(_ shortcutItem: UIApplicationShortcutItem) -> Bool {
var handled = false
guard ShortcutIdentifier(fullType: shortcutItem.type) != nil else { return false }
guard let shortCutType = shortcutItem.type as String? else { return false }
switch shortCutType {
case ShortcutIdentifier.first.type:
NotificationCenter.default.post(name: .applicationLaunchedWithNewPostShortcutItem, object: nil, userInfo: nil)
handled = true
break
default:
break
}
return handled
}
对于不熟悉上述方法的人,通常在你的AppDelegate.swift中定义,在application(_:performActionFor:completionHandler:)中调用,也在AppDelegate.swift中调用。参见 Apple 的示例代码 here.
最后,通过在 HomeViewController 中实现 addObservers() 和 removeObservers() 方法,让 HomeViewController 能够调入通知。
class HomeViewController {
// MARK: - View Controller Life Cycle
override func viewDidLoad() { // or viewWillAppear(), etc.
super.viewDidLoad()
NotificationCenter.default.addObserver(forName: .applicationLaunchedWithNewPostShortcutItem, object: nil, queue: .main) { [weak self] (notification) in
self?.handleApplicationLaunchedWithNewPostShortcutItem(notification: notification)
}
}
deinit { // or viewWillDisappear(), etc.
removeObservers()
}
// MARK: - Notification Center Handlers
private func handleApplicationLaunchedWithNewPostShortcutItem(notification: Notification) {
performSegue(withIdentifier: "presentNewPost", sender: nil)
}
我在应用程序中使用 3D 触摸快捷方式时遇到问题。我的应用程序使用选项卡,但我想将用户重定向到一个选项卡,然后在他们按下创建愿望列表按钮时也重定向到另一个 segue。
Here is a picture of my storyboard.
我目前使用的代码显示主视图控制器,但我希望它进入创建愿望列表控制器。
我在应用程序委托中的句柄快捷方式代码在这里:
func handleShortcut( shortcutItem:UIApplicationShortcutItem ) -> Bool {
print("Handling shortcut")
var succeeded = false
if( shortcutItem.type == "com.example.Giftr" ) {
print("- Handling \(shortcutItem.type)")
if let tabVC = self.window?.rootViewController as? UITabBarController{
tabVC.selectedIndex = 1
//This is where I need to swap to the "createwishlist" view controller.
}
这应该可以在您成功切换标签后将 ViewController 更改为您想要的 class。
let vc = ViewController() //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)
为了解决这个问题,我使用了一个全局变量来存储快捷方式已在 appDelegate 中使用,如下所示。
GlobalVars.shortcut = 1
let tabVC = window?.rootViewController as! UITabBarController
print(tabVC.self)
tabVC.selectedIndex = 0
然后在 selectedIndex 0 选项卡的控制器内部检查该值是否为 1,然后它是否被转到我想要结束的视图控制器。如图所示。
override func viewDidAppear(animated: Bool) {
if(GlobalVars.shortcut == 1)
{
self.performSegueWithIdentifier("shortcut", sender: self)
GlobalVars.shortcut = 0
}
}
确保将全局变量设置为 0,否则每次出现视图时都会调用它。
我会使用 NotificationCenter。假设您的应用程序自然启动到 HomeViewController,它恰好是主选项卡栏控制器的第一个 VC,并且您想要定义 "New Post" 快捷方式项,以便在加载 HomeViewController 后立即执行转到 NewPostViewController。
首先,定义通知名称:
extension Notification.Name {
Notification.Name("applicationLaunchedWithNewPostShortcutItem")
}
其次,post应用程序启动时的快捷方式通知(我假设它是第一个静态快捷方式项目):
func handleShortCutItem(_ shortcutItem: UIApplicationShortcutItem) -> Bool {
var handled = false
guard ShortcutIdentifier(fullType: shortcutItem.type) != nil else { return false }
guard let shortCutType = shortcutItem.type as String? else { return false }
switch shortCutType {
case ShortcutIdentifier.first.type:
NotificationCenter.default.post(name: .applicationLaunchedWithNewPostShortcutItem, object: nil, userInfo: nil)
handled = true
break
default:
break
}
return handled
}
对于不熟悉上述方法的人,通常在你的AppDelegate.swift中定义,在application(_:performActionFor:completionHandler:)中调用,也在AppDelegate.swift中调用。参见 Apple 的示例代码 here.
最后,通过在 HomeViewController 中实现 addObservers() 和 removeObservers() 方法,让 HomeViewController 能够调入通知。
class HomeViewController {
// MARK: - View Controller Life Cycle
override func viewDidLoad() { // or viewWillAppear(), etc.
super.viewDidLoad()
NotificationCenter.default.addObserver(forName: .applicationLaunchedWithNewPostShortcutItem, object: nil, queue: .main) { [weak self] (notification) in
self?.handleApplicationLaunchedWithNewPostShortcutItem(notification: notification)
}
}
deinit { // or viewWillDisappear(), etc.
removeObservers()
}
// MARK: - Notification Center Handlers
private func handleApplicationLaunchedWithNewPostShortcutItem(notification: Notification) {
performSegue(withIdentifier: "presentNewPost", sender: nil)
}