应用程序快捷方式打开 TableView 行

Posted

技术标签:

【中文标题】应用程序快捷方式打开 TableView 行【英文标题】:Application Shortcut Open TableView Row 【发布时间】:2018-06-20 19:19:13 【问题描述】:

强制按下我的应用程序图标时,我设置了四个应用程序快捷方式。我有一个带有导航控制器的标签栏控制器,每个控制器都有表视图控制器作为前两个标签的根视图控制器。

对于快捷方式,如何打开第一个或第二个选项卡并从相应的表格视图中选择一行?

我想我会从这个开始,但如果我错了,请纠正我。

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
    

【讨论】:

谢谢。这主要在一些调整后起作用。请查看我的更新。 我想知道tableView.selectRow 是否触发了委托方法didSelectRow,所以它实际上被调用了两次。能否在UITableViewControllerdidSelectRow 方法中设置断点或print 语句,看看发生了什么? 我用延迟块编辑了我的代码,使其看起来像你的代码,并将 didSelectRow 委托方法添加到块的末尾,它似乎可以正常工作。 @raginggoat 很好。视图控制器现在只被推送一次吗?

以上是关于应用程序快捷方式打开 TableView 行的主要内容,如果未能解决你的问题,请参考以下文章

如何持久化 tableview 行?

如何在 C# 中使用命令行参数创建应用程序快捷方式(.lnk 文件)

ubuntu terminal快捷键

我的应用程序如何打开 Siri 快捷方式记录短语视图

以编程方式更改 TableView 行外观

在使用 CoreData 的 TableView 中将行移至底部