Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

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

Beginning iPhone Development with Swift: Exploring the iOS SDK

「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を消してしまうステップを入れることが望ましいというのが予想できます。

ということで今日はここまで。