我正在使用 this answer 中的 ToastView 类,但我遇到了与事件指示器相同的问题。我在整个应用程序中都有 ToastViews,但如果它能正常工作,我会毫不犹豫地切换到指示器
我的应用程序有一个显示选项的表格 View 。选择一个选项后,需要加载很多关于该选项的信息,像这样
class TableController : UITableViewController
{
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
index = (indexPath as NSIndexPath).row
super.performSegue(withIdentifier: "cellSelectedSegue", sender: self)
}
}
class cellSelectionView : UIViewController
{
override func viewDidLoad() {
super.viewDidLoad()
if let data = parser.getData(...){
// data processing
}
}
}
我想让用户知道当他们选择一个单元格时正在进行加载操作。否则,一个单元格将被选中,呈现单元格选择的颜色,应用程序会在 segue 发生之前静止一秒钟。
为此,我尝试过
// In the tableview:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// Solution 1: ToastView.showInParent(parentView: self.view, text: "ayy lmao", duration: 1.0)
// Solution 2: indicator.startAnimating()
index = (indexPath as NSIndexPath).row
super.performSegue(withIdentifier: "cellSelectedSegue", sender: self)
}
这两种解决方案都不起作用,因为在单元格选择 UI 事件完成之前不会触发 UI 事件,而在数据处理发生之前不会完成,这完全违背了这一点。我也试过将 UI 调用移动到 willSelectRowAt,没有任何区别。 我想知道如何让用户知道涉及 UI 事件的加载任务。
如果您想知道为什么我不在显示单元格之前进行数据处理而不是在选择时进行数据处理,那是因为每行的处理量很大。如果这样做,tableview 将需要很长时间才能显示
最佳答案
一些不同的选择 -
- 在推送 View 中,将
getData
方法放在viewDidAppear
而不是viewDidLoad
中。在viewDidLoad
中完成所有操作之前, View 不会推送。然后您可以在推送的 View 上显示您的加载指示器。 - 将
UIActivityIndicator
放入单元格内,并根据保存单元格索引的变量(例如indexLoading
)显示/动画显示它。然后将indexLoading
设置为按下的单元格行,并在该索引路径上调用reloadRowsAtIndexPaths
。 如果单元格的indexPath.row
匹配indexLoading
,显示指示器 - 在
didSelectRow...
上发送将推送 View 的通知。从您的 TableView Controller 中收听该通知,并在您的 TableView 上显示加载指示器。
关于iOS Swift 4 - 在 tableview didSelectRowAt 上显示 Toast(或事件指示器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46476833/