我有一个展开segue,在将图像保存到磁盘时需要几秒钟才能完成。我想显示一个活动指示器,直到视图被关闭但视图没有更新。
这是我的功能,在视频控制器解除之前从视图控制器调用:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "saveRecord" {
print("indicator")
let indicator = UIActivityIndicatorView()
indicator.frame = self.view.frame
indicator.activityIndicatorViewStyle = .whiteLarge
indicator.color = UIColor.blue
indicator.hidesWhenStopped = true
indicator.startAnimating()
self.view.addSubview(indicator)
self.view.layoutSubviews()
print("laid out subviews")
}
}
执行两个打印语句,调试器显示指示符已作为子视图添加到主视图中,但它不会出现在屏幕上。我错过了什么吗?
我知道指标的位置不是问题,因为在viewDidLoad中运行相同的代码会在屏幕中间正确显示它。
更新
我已经使用委托重新创建了segue函数,并且它正确地保存了所有内容,但问题仍然存在。仍然没有活动指标。
@IBAction func saveRecord(_ sender: Any) {
print("indicator")
let indicator = UIActivityIndicatorView()
indicator.frame = self.view.frame
indicator.activityIndicatorViewStyle = .whiteLarge
indicator.color = UIColor.blue
indicator.hidesWhenStopped = true
indicator.startAnimating()
self.view.addSubview(indicator)
self.view.layoutSubviews()
print("laid out subviews")
saveImages()
print("saved images")
self.delegate?.saveRecord(name: name!, category: category)
print("saved record")
self.navigationController?.popViewController(animated: true)
}
更新2
我现在真的很困惑!这将启动指标:
@IBAction func saveRecord(_ sender: Any) {
print("indicator")
indicator.startAnimating()
//saveImages()
//print("images saved")
//performSegue(withIdentifier: "saveRecord", sender: self)
}
但这并不是:
@IBAction func saveRecord(_ sender: Any) {
print("indicator")
indicator.startAnimating()
saveImages()
print("images saved")
performSegue(withIdentifier: "saveRecord", sender: self)
}
答案 0 :(得分:0)
我认为你应该使用popViewController而不是unwind segue。然后你可以在后退按钮上使用自定义功能进行更多控制。
你可以做的是:
答案 1 :(得分:0)
您无法在prepare(for:)
中更新您的观看次数; segue已经在进行中。
不是直接从UI元素触发展开segue,而是触发一个动作方法,显示活动指示符并执行保存,然后调用performSegue(withIdentifier:"yourUnwindSegueIdentifier", sender:self)
来实际执行展开。
答案 2 :(得分:0)
问题是UI在saveRecord函数完成之前不会更新,但随后会调用segue,因此视图控制器会立即被解除。我使用派遣队列解决了这个问题 - 这是我今天学到的另一项新技能!:
drv <- dbDriver("PostgreSQL")