Swiftで遊ぼう! - 309 - My Fourth Project switchViews()
Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide
質問 : Swiftで遊ぼう! - 252 - FaceViewプロジェクト始動 - Swiftで遊ぼう! on Hatena
Beginning iPhone Development with Swift: Exploring the iOS SDK
- 作者: David Mark,Jack Nutting,Kim Topley,Fredrik Olsson,Jeff LaMarche
- 出版社/メーカー: Apress
- 発売日: 2014/11/19
- メディア: Kindle版
- この商品を含むブログを見る
「switchViews」ボタンのコーディングの説明をしていきます。
@IBAction func switchViews(sender: UIBarButtonItem) { if orangeViewController?.view.superview == nil { if orangeViewController == nil { orangeViewController = storyboard?.instantiateViewControllerWithIdentifier("Orange") as? OrangeViewController } } else if blueViewController?.view.superview == nil { if blueViewController == nil { blueViewController = storyboard?.instantiateViewControllerWithIdentifier("Blue") as? BlueViewController } } if blueViewController != nil && blueViewController!.view.superview != nil { orangeViewController.view.frame = view.frame switchViewController(from: blueViewController, to: orangeViewController) } else { blueViewController.view.frame = view.frame switchViewController(from: orangeViewController, to: blueViewController) } }
まず理解しやすいようにアプリの挙動にあわせて考えます。
アプリを立ち上げた時に、viewDidLoat()メソッドを使用して、blueViewControllerとそのルートビューが表示されます。最初の立ち上がり時にorangeViewControllerとそのルートビューはインスタンス化されていません(レイジーローディング)。
この状態で、「switchViews」ボタンを押します。
orangeViewController?.view.superviewは、オプショナルチェインのところでnilなので、「 orangeViewController?.view.superview == nil 」はtrueとなり、条件式の中に入ります。
「orangeViewController == nil」もtrueです。
ここで1つ疑問が生じるでしょう。どうして2つの条件式を評価しないといけないか?
orangeViewControllerが存在しても、ルートビューが表示されていない場合があるからです。
でも「orangeViewController?.view.superview」が存在すれば、orangeViewControllerは当然存在するので、その他のステップは必要ないということです。
このステップでorangiViewControllerのインスタンス化が生じました。
「else if」は当然省かれます。
次のコードブロックに移って、blueViewControllerを確認します。
アプリを立ち上げ時にblueViewControllerとルートビューは表示されているので、「blueViewController != nil」も「blueViewController!.view.superview != nil 」もtrueで、条件式が評価されます。
switchViewController()メソッドに、blueViewControllerとorangeViewControllerをパラメーターとして与えて、blueViewControllerからoragneViewControllerにバトンタッチさせます。
こういう流れがこのボタンにコードされています。
このままでは2つのViewControllerがインスタンス化していてメモリー管理上よくないですよね。
まだ、switchViewController()メソッドの説明が出てきていませんが、このメソッドの中で使わないViewControllerを消してしまうステップを入れることが望ましいというのが予想できます。
ということで今日はここまで。