在应用关闭时从本地通知中选择tableview单元格

时间:2017-07-11 11:13:56

标签: ios swift uitableview uilocalnotification

我正在我的iOS10应用中实施本地通知。这是一个简单的主 - 细节应用程序,用户输入有效期限的物品(药物)。项目过期时会触发通知。

应用程序结构是DrugTableViewControllerDetailViewController(包含药物对象的数组药物),嵌入在导航控制器中。

当用户点按通知时,我正在尝试在tableview中选择相应的行。

当应用程序处于打开状态或后台时,以下代码成功,但在收到通知时关闭应用程序时不会选择该行(尽管它仍然正确加载了表格视图)。

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中实例化我的详细视图控制器,但这不起作用。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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