質問: 1つ前に戻る場合は、`self.dismissViewControllerAnimated(true, completion: nil)` で、その閉じた画面は deinit されるのですが、又は2つ前に戻る場合も、deinit されるのですが、 `self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)` 画面遷移が処理によってまちまちの場合など、対象の view から移動した時に必要に応じて、画面を移動し、指定した画面のインスタンスを破棄することはできないものでしょうか? 初歩的な質問で申し訳ございませんが、 Swift のプログラム開発(スマホアプリ)をはじめて2週間ほどの素人です どなたか教えていただければと思います。 状況は下記のような画面遷移の場合で、画面4(失敗画面)から画面2へ戻る時に 画面2のインスタンスを破棄し新たに、初期処理を実行したいと思っております。 ————————————————————————————————————— 画面1(スタート画面)→画面2(メイン画面)┠→画面3(成功画面) ┠→画面4(失敗画面) ————————————————————————————————————— 画面4にはボタンが”はい” と ”いいえ”があり ”はい”が選択された場合は、画面2へ ”いいえ”が選択された場合は、画面1へそれぞれ移行したいのですが //”はい”を選択時下記コードを実行すると `self.dismissViewControllerAnimated(true, completion: nil)` //画面4のインスタンスを破棄して画面2に戻ると当然前回の内容のまま //viewDidLoad を実行せずに画面2に戻ってしまうのですが、 //画面2から失敗画面に遷移するタイミングで、画面2のインスタンスを解放できないものでしょうか? //また画面2へ移行するタイミングで画面の内容を初期化したいのですが //“いいえ”を選択時下記コードを実行 //画面4のインスタンスを破棄後画面1へ戻る(画面4、画面2とも deinit されているようです) `self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)`
回答: 画面を初期化したいので、View Controllerをメモリから解放して、おなじView Controllerを生成するというのは、やや乱暴な話です。モーダルから戻る直前に、View Controller上の諸項目を、スタート状態に戻しておくという処理で、なんの問題も起きないでしょう。 たとえば...... モーダルを呼ぶ側のView Controllerのクラスを、`ViewController`とします。`ViewController`には、3つの`UITextField`があって、モーダルView Controllerで、OKボタンを押したら、3つの`UITextField`に入力されたテキストを消してから「dismiss」するとします。 ``` class ViewController: UIViewController { @IBOutlet weak var textField1: UITextField! @IBOutlet weak var textField2: UITextField! @IBOutlet weak var textField3: UITextField! override func viewDidLoad() { super.viewDidLoad() clearValues() } // 諸項目を開始状態に戻す。 func clearValues() { textField1.text = "" textField2.text = "" textField3.text = "" } ・・・・・・・ } ``` そして、モーダルView ControllerのOKボタンのアクションメソッド`dismissWithOK()`を、こう実装します。 ``` @IBAction func dismissWithOK(sender: AnyObject) { if let controller = self.presentingViewController as? ViewController { controller.clearValues() controller.dismissViewControllerAnimated(true, completion: nil) } } ```