2015-12-02 2 views
2

У меня есть следующая проблема. Когда я запускаю свое приложение на своем телефоне, 3d коснитесь значка и выберите быстрое действие, которое запускает приложение, представляющее правильный контроллер просмотра, но когда я помещаю приложение в фоновом режиме и пытаюсь вызвать быстрое действие, он просто открывает приложение, в котором я Оставь это. Поэтому, чтобы заставить его работать, я должен каждый раз убивать свое приложение. Вот мой код:3D-сенсорные быстрые действия Предварительный просмотр контроллера только один раз

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) 
     }) 

    } 
} 

Спасибо заранее.

+1

Вызывает ли это performActionForShortcutItem? Is root = nil? – beyowulf

+0

Где он должен вызывать функцию performActionForShortcutItem? –

+1

Я имею в виду, просто попробуйте что-то напечатать в файле performActionForShortcutItem, чтобы убедиться, что он вызван. Возможно, print (root), почему вы можете проверить, вызывается ли функция performActionForShortcutItem, и убедитесь, что root не равен нулю. – beyowulf

ответ

4

Я предполагаю, что вы пытаетесь представить контроллер вида с контроллера вида, который не отображается. Вы можете использовать такие расширения как:

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, выше вашего приложения класса делегата, чтобы получить видимый в данный момент контроллер представления. enter image description here Затем представьте контроллер поиска. Например:

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) 
     }) 

    } 
} 
+0

Спасибо, но я до сих пор не понимаю, где поставить эту функцию и где ее называть. –

+1

Извините, я кое-что оставил. – beyowulf

+0

Он дает ошибку на этой строке: расширение UIViewController { Объявление действителен только в области файлов –

Смежные вопросы