Ярлык приложения Открыть строку TableView

У меня есть четыре ярлыка приложения, установленные при нажатии на иконку приложения. У меня есть контроллер панели вкладок с контроллерами навигации, каждый с контроллерами табличного представления в качестве корневого контроллера представления для первых двух вкладок.

Для ярлыков, как я могу открыть первую или вторую вкладку и выбрать строку в соответствующем табличном представлении?

Думаю, я бы начал с этого, но, пожалуйста, поправьте меня, если я ошибаюсь.

let tabNav:UINavigationController = tabBar.viewControllers?[0] as! UINavigationController

--- РЕДАКТИРОВАТЬ --- После работы с предоставленным ответом у меня это несколько работает.

let navigationController = tabBar.viewControllers![0] as! UINavigationController
let tableViewController = navigationController.viewControllers.first as! FederationTableViewController
let indexPath = IndexPath(row: 0, section: 0)
tableViewController.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .top)
tableViewController.tableView.delegate?.tableView!((tableViewController.tableView)!, didSelectRowAt: indexPath)

tabBar.selectedIndex = 0

Это выберет правильную строку и откроет правильный контроллер представления. Проблема, с которой я столкнулся сейчас, заключается в том, что он нажимает контроллер представления для выбранной строки дважды, поэтому контроллер представления, который нажимается при выборе этой строки, загружается дважды.

1 ответ

Решение

Вам необходимо получить элемент ярлыка в делегате приложения, а затем выполнить соответствующее действие в зависимости от типа ярлыка, который вы определили в info.plist, Нечто подобное должно работать, хотя может потребоваться изменение в зависимости от точной структуры вашего приложения или имен ваших подклассов и т. Д.

В приложении делегат:

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    print("Opening app from 3D touch shortcut...")
    completionHandler(handleShortcut(shortcutItem: shortcutItem))
}

// This function handles the shortcut. Any problems will return false, preventing the shortcut opening.
private func handleShortcut(shortcutItem: UIApplicationShortcutItem) -> Bool {
    if shortcutItem.type == "firstShortcutType" {
        guard let tabBarController = self.window.rootViewController as? UITabBarController else { return false }
        guard let navigationController = tabBarController.viewcontrollers[0] as? UINavigationController else { return false }
        guard let tableViewController = navigationController.rootViewController as? UITableViewController else { return false }

        // Select index of tab bar controller
        tabBarController.selectedIndex = 0

        // TableView May not be loaded, so I wrap this in a delayed block
        DispatchQueue.main.asyncAfter(deadline: .now()+1, execute: {
            // Create index path
            let indexPath = IndexPath(row: 0, section: 0)
            self.tableViewController.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
        })
        return true

    } else if shortcutItem.type == "otherShortcutType" {
        // Handle ofher shortcut types
    } else {
        return false
    }
}
Другие вопросы по тегам