2016-01-16 1 views
1

В принципе, я пытаюсь реализовать Быстрые действия в моем приложении. Когда я нажимаю на одном из быстрых действий, я получаю ошибку:Предупреждение: попытка представления ViewController, чей ViewController не находится в иерархии представлений (3D Touch)

Warning: Attempt to present theViewController on ViewController whose view is not in the window hierarchy!

Я смотрел на некоторые другие должности Stack Over Flow, которые имели один и тот же вопрос, но решения не работает для меня. Кроме того, в моем applicationDidEnterBackground метод, который я добавил self.window?.rootViewController?.dismissViewControllerAnimated(true, completion: nil).

Вот некоторые из соответствующих 3D методов сенсорного, которые я включил в App Делегат:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) { 
    let handledShortcutItem = self.handleShortuctItem(shortcutItem) 
    completionHandler(handledShortcutItem) 
} 

Кроме того, у меня есть эти вспомогательные методы:

enum ShortcutIdentifier: String { 
    case First 
    case Second 

    init?(fullType: String) { 
     guard let last = fullType.componentsSeparatedByString(".").last else { return nil } 
     self.init(rawValue: last) 
    } 
    var type: String { 
     return NSBundle.mainBundle().bundleIdentifier! + ".\(self.rawValue)" 
    } 
} 

func handleShortuctItem(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: 
     handled = true 
     let navVC = mainStoryboard.instantiateViewControllerWithIdentifier("firstViewController") as! FirstViewController 
     self.window?.rootViewController?.presentViewController(navVC, animated: true, completion: nil) 
     break 
    case ShortcutIdentifier.Second.type: 
     handled = true 
     let navVC = mainStoryboard.instantiateViewControllerWithIdentifier("secondViewController") as! SecondViewController 
     self.window?.rootViewController?.presentViewController(navVC, animated: true, completion: nil) 
     break 
    default: 
     break 
    } 


    return handled 
} 
+0

@matt Я отредактировал мое сообщение, чтобы показать код. Есть идеи? – Harish

+0

Это может помочь: http://useyourloaf.com/blog/adding-3d-touch-quick-actions.html Проблема может заключаться в том, что интерфейс не появился в то время, когда вы запускаете свой ярлык. – matt

+0

@matt Хорошо, но с 3D Touch мне нужно, чтобы он работал всегда, потому что я не знаю, когда пользователь нажимает на быстрое действие, и мне нужно, чтобы он работал, когда они это делают. – Harish

ответ

1

Этакий бессмысленные раствора, чтобы обернуть вокруг задержки presentViewController вызовов (delay определяется здесь: dispatch_after - GCD in swift?):

switch(shortcutType) { 
case ShortcutIdentifier.First.type: 
    handled = true 
    let navVC = mainStoryboard.instantiateViewControllerWithIdentifier("firstViewController") as! FirstViewController 
    delay(0.3) { 
     self.window?.rootViewController?.presentViewController(navVC, animated: true, completion: nil) 
    } 
    break 
case ShortcutIdentifier.Second.type: 
    handled = true 
    let navVC = mainStoryboard.instantiateViewControllerWithIdentifier("secondViewController") as! SecondViewController 
    delay(0.3) { 
     self.window?.rootViewController?.presentViewController(navVC, animated: true, completion: nil) 
    } 
    break 
default: 
    break 
} 

Идея заключается в том, чтобы дать время интерфейса завершить работу перед попыткой сделать презентацию.

+0

Хм ... Я пробовал вставлять в код, который вы положили, но он все еще не работает. Я действительно удивляюсь, почему эта ошибка происходит. Я смотрел на другой стек над потоками сообщений, но ничего не работает. Я знаю, что приложение отлично работает, когда я полностью закрываю приложение, а затем выполняю быстрые действия на домашнем экране. Однако, если приложение работает в фоновом режиме, а затем я вызываю быстрое действие, я получаю ошибку. – Harish

+0

На самом деле, я попробовал ваше решение, но вместо этого я изменил время с 0,3 до 0,7 секунды, что помогло мне. Я думаю, что для этой цели потребовалось больше времени, чтобы закончить появление и полную загрузку. Большое спасибо за вашу помощь, я действительно задавался вопросом, почему это не работает. – Harish

+0

Но учтите, что это не настоящее решение. Это метод доказательства концепции. Мы просто пинали банку по дороге. Мы знаем проблему (ваш код работает до того, как интерфейс был собран), но мы на самом деле не создали решение в приложении. – matt

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

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