Swiftにおけるコントローラ封じ込めの表示


ビューコントローラの封じ込めは、Uikitでよく使われるテクニックです.
これは、大幅に複数の小さなものに分割することで、ビューコントローラの複雑さを大幅に減らすことができます.
より小さいビューコントローラを持って、機能的な範囲を減らして、あなたのコードベースを通して再利用可能であるように、テストをより簡単にします.

実践例


あなたのアプリでビデオプレーヤーを持っているとしましょう.画面の最初の3番目のコントロールは、すべての(再生/一時停止、時間インジケータ)、実際のビデオプレーヤーのために使用される画面の残りの部分は、プレイリストが表示されます.非常に一般的なレイアウト-あなたがYouTubeアプリで見つける正確なもの.

このPlayerViewControllerを分割するのは非常に適しています.
  • VideoPlayerViewController
  • PlayListViewController
  • つの小さなビューコントローラには、デリゲートのような単純なインターフェースがあります.
        func playerDidEndPlaying(player: Player, media: Media)
        func playlistDidSelect(playlist: Playlist, media: Media)
    
    これらのメソッドを実装し、2つの子ビューコントローラのデータソースとして使用する「メイン」ビューコントローラを構築できます.
    あなたがコメントセクションのためにプレイリストを交換することを望むならば、最高の部分はそうです、そして、ユーザーアクションの後、あなたはちょうどCommententViewControllerによってプレイリスト子供視点コントローラを交換します.

    その後、独立してコメント、選手、プレイリストを表示コントローラをテストすることができます.
    見ることができるように、コントローラコントローラーのビューは、再利用性、より良いコード組織、複雑さとより良いテストを減らすために大きいです.
    ここでは、子ビューコントローラを追加および削除する非常に便利な拡張機能があります.
    extension UIViewController {
        /// Add a child UIViewController to a given UIView. If `view` is set to nil or not set, it will add the child the ViewController's view.
        /// - Parameters:
        ///   - child: Child view controller as a UIViewController
        ///   - view: Target UIVew that will contain the child
        func add(_ child: UIViewController, view: UIView? = nil) {
            let view: UIView = view ?? self.view
            addChild(child)
            child.view.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(child.view)
            NSLayoutConstraint.activate([
                child.view.topAnchor.constraint(equalTo: view.topAnchor),
                child.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
                child.view.leftAnchor.constraint(equalTo: view.leftAnchor),
                child.view.rightAnchor.constraint(equalTo: view.rightAnchor),
            ])
            child.didMove(toParent: self)
        }
    
    
        /// Remove a child viewController from it's container
        func remove() {
            guard parent != nil else {
                return
            }
            willMove(toParent: nil)
            view.removeFromSuperview()
            removeFromParent()
        }
    }
    
    PlayerViewControllerを使用して指定された例に基づいて簡単に使用できるケースは次のようになります.
    class PlayerViewController: UIViewController {
        let player = VideoPlayerViewController()
        let playlist = PlaylistViewController()
        let comment = CommentViewController()
    
        let playerViewContainer = UIView()
        let bottomViewContainer = UIView()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.add(self.player, view: self.playerViewContainer)
            self.add(self.playlist, view: self.bottomViewContainer)
        }
    
        func showComment() {
            self.playlist.remove()
            self.add(self.comment, view: self.bottomViewContainer)
        }
    }
    
    あなたが見ることができるように、それは非常に簡単ですし、“主な”ビューコントローラをきれいにし、プレーヤー、プレイリストやコメント関連のビジネスロジックから無料です!
    ビューコントローラの格納の再利用性と清浄性の他に、主な利点は、子プロセスコントローラが親のライフサイクルと対話することができるということである(didLoaddidAppear ...).
    この小さなポストを楽しんでください.私はコーディングの私の方法についての共有が好きです、あなたが質問をするならば、さえずりの上で私を殴って自由にするか、コメントセクションを使用してください.)
    ハッピーコーディング!