选项卡视图的 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)
    }