应用程序关闭时从本地通知中选择表格视图单元格

Selecting tableview cell from local notification when app closed

我正在我的 iOS10 应用程序中实现本地通知。这是一个简单的主从应用程序,用户可以在其中输入带有有效期的物品(药品)。项目过期时会触发通知。

应用程序结构是一个 DrugTableViewController 和一个 DetailViewController(包含药物对象数组药物)嵌入在导航控制器中。

我试图在用户点击通知时在 tableview selected 中获取适当的行。

当应用程序打开或在后台运行时,下面的代码是成功的,但当收到通知时应用程序已关闭时,select行不成功(尽管它仍然正确加载表视图)。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    // Pull out the buried userInfo dictionary
    let userInfo = response.notification.request.content.userInfo
    if let drugID = userInfo["drug"] as? String {

        let navigationController = self.window?.rootViewController as! UINavigationController
        let destinationViewController = navigationController.viewControllers[0] as! DrugTableViewController
        navigationController.popToViewController(destinationViewController, animated: true)


        var selectRow: Int? = nil
        for drug in destinationViewController.drugs {
            if drug.uniqueID == drugID {
                selectRow = destinationViewController.drugs.index(of: drug)!
                let path = IndexPath(row: selectRow!, section: 0)
                destinationViewController.tableView.reloadData()
                destinationViewController.tableView.selectRow(at: path, animated: true, scrollPosition: .top)
                selectRow = nil
                break
            }
        }
    }
    // Call completion handler
    completionHandler()
}

我也试过从故事板 ID 实例化我的细节视图控制器,但这不起作用。

如有任何帮助,我们将不胜感激!

在加载 table 视图之前,可以调用此代码。首先尝试延迟通知处理一秒钟: DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: { //Your code here }) 看,它是否有帮助。如果愿意,想一想如何检查 tableview 是否已加载(或刚刚离开延迟)