我想使用某些ID从didSelectRowat索引路径调用api,并且根据api的响应,我需要移至其他屏幕。
func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){
let contactDB : FMDatabase!
contactDB = FMDatabase(path: databasePath!)
if contactDB != nil{
if contactDB.open(){
let read:Int = 1
let campaignID = self.notification_details[indexPath.row].userId
let querySQL = "UPDATE new_notifications SET read = \(read) WHERE from_id = \"\(campaignID)\""
let results:FMResultSet? = contactDB.executeQuery(querySQL,withArgumentsIn: nil)
}
contactDB.close()
}
let cell = tableView.cellForRow(at: indexPath)
cell?.layer.backgroundColor = UIColor.clear.cgColor
if self.notification_details[indexPath.row].notification_type == "LIVE"{
DispatchQueue.main.async {
NotificationCenter.default.post(name: Notification.Name("live_notification_notificationtab"), object: self.notification_details[indexPath.row].campaign_id)
}
}
答案 0 :(得分:0)
是的,我们可以。但是您要么需要在进行异步调用时阻止用户交互,要么需要在用户交互时中断异步调用。
为防止用户交互,最简单的方法是在整个表视图上添加另一个视图,在其上添加一些活动指示器,并将其默认设置为隐藏。然后假设是这样:
func userSelectedItem(_ item: MyObject) {
progressBackground?.isHidden = false
progressActivityIndicator?.startAnimating()
MyObject.fetchDetails(id: item.id) { detailedObject in
self.navigationController?.pushViewController(DetailedObjectViewController(detailedObject), animated: true)
self.progressBackground?.isHidden = true
self.progressActivityIndicator?.stopAnimating()
}
}
这类似于:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
userSelectedItem(items[indexPath.row])
}
但这全取决于您如何实现表格视图。
无论如何,您可能需要在某些事件上中断操作。例如,如果用户在进行异步操作时导航到另一个屏幕,则您希望在提取完成后阻止调用。最直接的过程是使用某些变量,例如var isVisible: Bool = false
,然后在出现时将其设置为true
,并在视图消失时将其设置为false
。然后,您可以在推入新视图控制器并决定是否进行导航的块内使用此属性。
答案 1 :(得分:0)
是的,您绝对可以做,但是,让我们分析什么是最好的方法。 假设您在表格视图中呈现了一些信息。一个用户选择了您要点击API的行,但是API响应需要一些时间才能从服务器传输到您的设备,因此在这种情况下,用户将做什么?如果您允许用户与UI交互,则他/她可以滚动屏幕并可以选择其他行,因此允许用户与API交互不是一个好主意,而应禁止用户使用该应用,直到您会收到响应,因此正确的做法是使用某些加载程序或指示器阻止用户,然后进行异步调用。