Ярлык приложения Открыть строку 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
}
}