2017-04-19 62 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) 
     } 
    } 
}