2017-04-19 58 views
0

我有一个展开赛格瑞这需要几秒钟就可以完成,而其保存图片到磁盘。我想直到视图撤职,但视图不更新以显示活动的指标。斯威夫特3 - 观点并不时更新赛格瑞准备叫

这是我的职责,这是从视图控制器之前,它驳回叫:

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中相同的代码正确地显示它在屏幕的中间。

UPDATE

我已经重新使用委托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

您是否在代码中调用了'performSegue'? –

+0

感谢艾哈迈德。是的,我已经试过触发SEGUE的各种方式,但我仍然得到同样的问题。 – Chris

回答

0

我认为你应该使用一个展开SEGUE的popViewController。然后,您可以通过后退按钮上的自定义功能进行更多控制。

你可以做的则是:

  • 当你点击后退按钮(或保存图像按钮),添加您指示
  • 然后保存图像
  • 当图像被保存删除指标
  • 弹出视图控制器
+0

谢谢。我仍然需要在目标视图控制器中执行某些操作,所以我认为这不适合我。 – Chris

+0

然后使用该委托模式。而且,Paulw11的答案几乎与我建议的那样相同) – Retterdesdialogs

+0

再次感谢。在委托模式(之前我没有使用过)的崩溃过程之后,我重写了它,但我仍然遇到同样的问题 - 请参阅最新的问题。 – Chris

0

不能在prepare(for:)更新您的意见;赛格已经在进行中。

不是直接从UI元素触发展开segue,而是触发一个操作方法,该方法显示活动指示符并执行保存,然后调用performSegue(withIdentifier:"yourUnwindSegueIdentifier", sender:self)实际执行展开。

+0

谢谢,我知道你来自哪里,但是如果没有放松时间,我该如何在目标视图控制器中完成segue动作?我对此感到困惑,因为文档https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html说:“您也可以使用展开操作来更新当前的视图控制器,然后展开顺序完成。 “ – Chris

+0

你仍然可以放松休息;按住Ctrl键从视图控制器图标拖动到退出图标,选择展开方法并给出结果标识,以便您可以调用'performSegue' – Paulw11

+0

谢谢Paul。再次,我可以使用该方法获取所有保存代码,但我的指标仍然不显示。 – Chris

0

问题是直到saveRecord函数完成后UI才会更新,但是然后调用了segue,因此视图控制器立即被解除。我使用调度队列解决了这个问题 - 我今天学到的另一项新技能!:

@IBAction func saveRecord(_ sender: Any) { 
    indicator.startAnimating() 
    DispatchQueue.global(qos: .userInitiated).async { 
     self.saveImages() 
     DispatchQueue.main.async { 
      self.performSegue(withIdentifier: "saveRecord", sender: self) 
     } 
    } 
}