【发布时间】:2020-04-24 08:36:44
【问题描述】:
我有一个UITableView 带有一些滑动操作。其中一个通过UIAlertController 显示操作表,并让用户更改UITableViewCell 的类别,使单元格出现在另一个部分中。
我尝试实现的是在做出选择后重新加载 tableView,但似乎警报是异步调用的。有人可以帮我了解调用堆栈以及将tableview.reloadData() 调用放在哪里吗?
let switchTypeAction = UIContextualAction(style: .normal, title: nil) { [weak self] (_,_,success) in
let ac = UIAlertController(title: "Change type", message: nil, preferredStyle: .actionSheet)
for type in orderItem.orderItemType.allValues where type != item.type {
ac.addAction(UIAlertAction(title: "\(type.prettyName)", style: .default, handler: self?.handleChangeType(item: item, type: type)))
}
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel))
self?.present(ac, animated: true)
tableview.reloadData()
success(true)
}
func handleChangeType(item: orderItem, type: orderItem.orderItemType) -> (_ alertAction:UIAlertAction) -> (){
return { alertAction in
item.type = type
}
}
我会假设调用是按这个顺序执行的,但是在调试时我看到self?.present(ac, animated: true) 实际上是在块之后执行的,所以首先执行重新加载和成功响应。这与@escaping?的闭包有什么关系吗?
【问题讨论】: