Swift 3 - 当为segue做准备时,查看不会更新

时间:2017-04-19 12:07:47

标签: ios swift segue

我有一个展开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)
}

3 个答案:

答案 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")