3

次の問題があります。携帯電話でアプリを実行すると、アイコンに3Dタッチしてクイックアクションを選択すると、正しいView Controllerを提示するアプリが起動しますが、アプリをバックグラウンドに置いてクイックアクションを呼び出そうとすると、持っているアプリが開きます残しました。そのため、機能させるには、毎回アプリを強制終了する必要があります。これが私のコードです:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if shortcutItem.type == "com.traning.Search" {

        let sb = UIStoryboard(name: "Main", bundle: nil)

        let searchVC = sb.instantiateViewControllerWithIdentifier("searchVC") as! UINavigationController

        let root = UIApplication.sharedApplication().keyWindow?.rootViewController
        root?.presentViewController(searchVC, animated: false, completion: { () -> Void in
            completionHandler(true)
        })

    }
}

前もって感謝します。

4

1 に答える 1

4

表示されていないView ControllerからView Controllerを提示しようとしていると思います。次のような拡張機能を使用できます。

    extension UIViewController {
    func topMostViewController() -> UIViewController {
        if self.presentedViewController == nil {
            return self
        }
        if let navigation = self.presentedViewController as? UINavigationController {
            return navigation.visibleViewController.topMostViewController()
        }
        if let tab = self.presentedViewController as? UITabBarController {
            if let selectedTab = tab.selectedViewController {
                return selectedTab.topMostViewController()
            }
            return tab.topMostViewController()
        }
        return self.presentedViewController!.topMostViewController()
    }
}

extension UIApplication {
    func topMostViewController() -> UIViewController? {
        return self.keyWindow?.rootViewController?.topMostViewController()
    }
}

これらの両方をアプリのデリゲート クラスの上にあるアプリの delegate.swift に配置して、現在表示されているビュー コントローラーを取得できます。ここに画像の説明を入力次に、その上に検索ビュー コントローラーを表示します。例えば:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if shortcutItem.type == "com.traning.Search" {

        let sb = UIStoryboard(name: "Main", bundle: nil)

        let searchVC = sb.instantiateViewControllerWithIdentifier("searchVC") as! UINavigationController

        let topViewController = UIApplication.sharedApplication.topMostViewController()
        topViewController.presentViewController(searchVC, animated: false, completion: { () -> Void in
            completionHandler(true)
        })

    }
}
于 2015-12-02T18:52:10.380 に答える