代码之家  ›  专栏  ›  技术社区  ›  raginggoat

应用程序快捷方式打开表格视图行

  •  1
  • raginggoat  · 技术社区  · 7 年前

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

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

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

    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 回复  |  直到 7 年前
        1
  •  2
  •   Chris    7 年前

    您需要在应用程序委托中接收快捷方式项目,然后根据您将在中定义的快捷方式类型采取适当的操作。 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
        }
    }