Как обрабатывать статические QuickActions для приложения iOS с помощью ViewControllers, управляемых TabBarController в Xcode, написанном на Swift

Я уже создал несколько (статических) быстрых действий в Info.plist для своего приложения iOS, созданного в Xcode и написанного на Swift.

У меня проблемы с открытием ViewController. Конечно, я уже гуглил, но у меня ничего не получалось. Если это считается: я использую ViewController, управляемый TabBarController. В большинстве учебных пособий используется NavigationController. Но, я думаю, это будет сделано с переходами, верно? Какой код мне нужен, чтобы справиться с этим?

Может ли кто-нибудь предоставить его, пожалуйста? Или кто-нибудь знает простое руководство/учебник?

С уважением, Дэвид.

P.S.: Я пробовал этот код, но он работает только с NavigationController?! Код:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void)
{
    self.handleShortcutItem(shortcutItem)
    completionHandler(true)
}

func handleShortcutItem(shortcutItem: UIApplicationShortcutItem)
{
    switch shortcutItem.type {
    case "icons.quickaction.home":
        self.presentComposeViewController()
    default: break
    }
}

func presentComposeViewController()
{
    guard let navigationController = window?.rootViewController as? UINavigationController else { return }

    let identifier = "MyViewController"
    let composeViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier(identifier)

    navigationController.pushViewController(composeViewController, animated: false)
}

person Community    schedule 06.06.2016    source источник
comment
Не совсем уверен, что вы имеете в виду… UITabBarController имеет свойство selectedIndex, которое показывает одно из его представлений.   -  person saagarjha    schedule 06.06.2016
comment
И какой код мне нужен для обработки моих быстрых действий?   -  person    schedule 06.06.2016
comment
Является ли composeViewController частью UITabBarController?   -  person saagarjha    schedule 06.06.2016
comment
Нет, я думаю, это не так. Я взял этот код из примера проекта с GitHub и попытался заставить его работать. Вы можете помочь мне? В чем моя вина?   -  person    schedule 06.06.2016
comment
Контроллер представления, вероятно, должен чем-то управляться. У вас должен быть контроллер навигации или контроллер панели вкладок в корне. Кстати, если у вас есть проект Github, я мог бы посмотреть на него.   -  person saagarjha    schedule 07.06.2016
comment
Это не совсем GitHub, но…: я взял проект 60 отсюда: dropbox .com/sh/asvszzv8lnje2f0/AABWtzKFRb1tRxRzlew9FWiia?dl=0 В этом проекте ViewControllers управляются NavigationController. Но, к сожалению, я не могу/не хочу использовать NavigationController. Мои ViewControllers управляются TabBarController. Вы можете мне как-то помочь?   -  person    schedule 07.06.2016
comment
Я до сих пор не могу представить ваш макет… не могли бы вы сделать скриншот раскадровки или что-то в этом роде?   -  person saagarjha    schedule 07.06.2016
comment
На самом деле я не перед компьютером, поэтому я не могу предоставить скриншот. Но я использую четыре UIViewController, управляемых одним UITabBarController.   -  person    schedule 07.06.2016
comment
Так является ли composeViewController частью контроллера панели вкладок? Если это так, вы можете просто установить selectedIndex. Если это подвид, установите правильный индекс, а затем нажмите его.   -  person saagarjha    schedule 07.06.2016
comment
Я даже не знаю, что такое composeViewController. Я просто скопировал его из проекта из интернета.   -  person    schedule 07.06.2016
comment
Я могу предоставить более подробную информацию завтра.   -  person    schedule 07.06.2016
comment
Привет, @ILikeTau, спасибо, что пытаешься мне помочь. Я загрузил свой проект здесь: filedropper.com/myapp Не могли бы вы загрузить и просмотреть его?   -  person    schedule 07.06.2016
comment
Ваш composeViewController является третьим контроллером представления в UITabBarController. guard let tabBarController = window?.rootViewController as? UITabBarController else { return }; tabBarController.selectedIndex = 2 должно работать (точка с запятой для разрыва строки). Не забудьте проверить наличие ярлыков во время запуска приложения.   -  person saagarjha    schedule 08.06.2016
comment
Привет, @ILikeTau, большое спасибо за совет. Это сделало это для меня. Вы мне очень помогли. Я опубликую свой рабочий код в качестве нового ответа.   -  person    schedule 08.06.2016
comment
@ILikeTau, какой код мне понадобится для первого значка слева? Просто установить цифру на 0? Потому что это не работает должным образом.   -  person    schedule 09.06.2016
comment
Хорошо, спасибо. Другая моя проблема не имеет ничего общего с вашим решением.   -  person    schedule 10.06.2016


Ответы (1)


Наконец-то я нашел решение с помощью @ILikeTau.

Я использую следующий код, чтобы открыть свои ViewControllers, управляемые TabBarController с помощью QuickAction:

@available(iOS 9.0, *)
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

    if(shortcutItem.type == "app.quickaction.search"){
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let vc = sb.instantiateInitialViewController()
        window?.rootViewController = vc
        guard let tabBarController = window?.rootViewController as? UITabBarController else { return };
                tabBarController.selectedIndex = 2
    }
    else if(shortcutItem.type == "app.quickaction.home"){
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let vc = sb.instantiateInitialViewController()
        window?.rootViewController = vc
        guard let tabBarController = window?.rootViewController as? UITabBarController else { return };
        tabBarController.selectedIndex = 0
    }
}

Этот код работает в обоих режимах: приложение находится в фоновом режиме и закрыто. Я думаю, что этот способ проще и короче, чем обычный способ с несколькими функциями.

person Community    schedule 08.06.2016