2017-04-19 3 views
0

イメージをディスクに保存するのに数秒かかります。ビューが閉じられてもビューが更新されなくなるまで、アクティビティインジケータを表示します。Segueの準備が完了したらSwift 3 - viewは更新されません

それは却下される前。これは、ビューコントローラから呼び出された私の関数で、次のとおりです。

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") 
    } 
} 

2つのprint文を実行し、デバッガはインジケータがサブビューとしてメインビューに追加されたことを示しています画面には表示されません。何か不足していますか?

viewDidLoadで同じコードを実行すると、画面中央に正しく表示されるため、インジケータの位置は問題ではないことがわかりました。

UPDATE

私は、デリゲートを使用してセグエ機能を再現したのだが、すべてを正しく保存していますが、問題が残っています。まだ活動インジケータはありません。

@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) 
} 

UPDATE 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

私はあなたの代わりにアンワインドセグエのpopViewControllerを使うべきだと思います。次に、戻るボタンのカスタム機能を使用して、より多くの制御を行います。あなたは何ができるか

は次のとおりです。

  • あなたは[戻る]ボタンをクリックする(または画像ボタンを保存)するとき、あなたインジケータ
  • を追加した画像が削除を保存するときに画像
  • を保存インジケータ
  • あなたはprepare(for:)であなたのビューを更新することはできません
+0

ありがとうございます。私はまだデスティネーションビューコントローラで作業を行う必要があるので、私はこれがうまくいくとは思わない。 – Chris

+0

それに代わってデリゲートパターンを使用します。そして、Paulw11の答えは私があなたに提案するものとほとんど同じです;) – Retterdesdialogs

+0

もう一度ありがとう。デリゲートパターン(以前は使用していなかった)のクラッシュコースの後、私はそれを修正しましたが、私はまだ同じ問題を抱えています - 更新された質問をご覧ください。 – Chris

0

ビューコントローラをポップ。セグエはすでに進行中です。

UIエレメントから直接巻き戻しセグをトリガーするのではなく、アクティビティインジケータを表示して保存を実行し、実際にアンワインドを実行するためにperformSegue(withIdentifier:"yourUnwindSegueIdentifier", sender:self)を呼び出します。

+0

ありがとうございます、どこから来ているのかわかりますが、巻き戻しの邪魔がない場合、どのように宛先ビューコントローラのセグアアクションを完了させるのですか?私はドキュメントhttps://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.htmlのように "これで困惑しています。また、巻き戻しセグが終了する前に巻き戻しアクションを使用して現在のビューコントローラーを更新することもできます。 " – Chris

+0

あなたはまだリラックスしたセグを持っています。 View ControllerアイコンからExitアイコンまでCtrlキーを押しながらドラッグし、unwindメソッドを選択し、結果セグを識別子にして、performSegueを呼び出すことができます – Paulw11

+0

Thanks 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) 
     } 
    } 
} 
関連する問題