addChildViewController 메모

3750 단어
몇 년 전 인터넷에서addChildViewController의 사용법을 표절한 적이 있지만, 그것을 이해하는 데 신경을 쓰지 않았다.그리고 표절된 코드가 많아서 왜 그렇게 썼는지 이해할 수가 없어요!(워낙 못 쓴 것도 있고, 자신을 오도하는 것도 있기 때문이다.)오늘 다시 한 번 해봤어요.공식 주석과 다른 사람의 코드를 참고하세요.먼저 몇 가지 속성, 방법을 살펴보겠습니다.
  • 하위 컨트롤러 그룹, 현재 전시된 하위 컨트롤러 포함하지 않음
  • open var childViewControllers: [UIViewController] { get }
    
  • 만약 이 하위 컨트롤러에 다른 부 컨트롤러가 있다면removeFromParent ViewController를 실행하는 방법으로 이 하위 컨트롤러를 현재 부 컨트롤러에서 제거합니다.이 방법을 다시 불러오려면 슈퍼 방법을 사용해야 합니다.
  • open func addChildViewController(_ childController: UIViewController)
    
  • 부모 컨트롤러의childViewControllers 그룹에서 자신을 제거합니다.다시 불러오면 슈퍼 방법을 사용해야 합니다.
  • open func removeFromParentViewController()
    
  • 이 방법은 형제 컨트롤러를 전환하는 데 사용할 수 있다.방법 호출자는 그들의 공통된 부 컨트롤러이다.([UIViewController addChildViewController:]로 부자 관계를 맺는다) 이 방법은 ['toViewController'의view]를 ['fromViewController'의view의 부모 보기view]에 추가합니다.전환이 완료되면 ['fromViewController'의view]가 부모 보기에서 제거됩니다......,이 방법 호출자는 iOS 컨테이너 클래스 컨트롤러 및 하위 클래스(tabbar,navigation controller 등)일 수 없습니다.
  • open func transition(from fromViewController: UIViewController, to toViewController: UIViewController, 
    duration: TimeInterval, options: UIViewAnimationOptions = [], 
    animations: (() -> Swift.Void)?, 
    completion: ((Bool) -> Swift.Void)? = nil)
    

    이 몇 가지 방법에 의하면 childViewControllers는addChildViewController와 함께 사용하는 것이라고 생각합니다. 물론 내부에remove와 관련된 조작이 있을 것이기 때문에 당분간 관심을 갖지 않아도 됩니다.addChildViewController는 특별한 작업 없이 그룹에 요소를 추가하여 쌍방의 부자 관계를 확인합니다.부모 컨트롤러는child View Controllers를 통해 어떤 아들이 아들인지 식별하고 아들들은 서로 형제다.관건적인 방법transition(from,to,duration,options,animations,completion)은 형제 컨트롤러의 전환에 사용된다.어떤 사람들은 매번 전환 방법을 호출하기 전에addChildViewController를 호출하고, 끝나면removeFromParent ViewController를 호출한다.순전히 바지를 벗고 방귀를 뀌는 거야!트랜잭션 방법이 하위 컨트롤러를 제거하지 않기 때문에 전혀 필요 없습니다.
    그래서 정확한 작법은 다음과 같다.
  • 상위 컨트롤러:
  • 1. 하위 컨트롤러 추가
    func addChildVCs() {
            //    firstVC  willMove(toParentViewController parent: UIViewController?)
            self.addChildViewController(firstVC)      
            //    secondVC  willMove(toParentViewController parent: UIViewController?)     
            self.addChildViewController(secondVC)    
            
            firstVC.view.frame = self.view.bounds
            self.view.addSubview(firstVC.view)
            firstVC.didMove(toParentViewController: self)    //    
            currentVC = localPackageVC
        }
    

    2. 하위 컨트롤러 사이의 전환(addChildViewController를 더 이상 쓸 필요가 없습니다!oldVC.removeFromParent ViewController()도 쓰지 마십시오.
    func changeControllerFrom(oldVC: UIViewController, to newVC: UIViewController) {
    
           //oldVC.willMove(toParentViewController: nil)       //    
           //newVC.willMove(toParentViewController: self)      //    
    
            newVC.view.frame = self.view.bounds
            self.transition(from: oldVC, to: newVC, duration: 0.5, options: UIViewAnimationOptions.transitionCrossDissolve, animations: {}, completion: { (isfinished) in
                if isfinished {
                    oldVC.didMove(toParentViewController: nil)       //    
                    newVC.didMove(toParentViewController: self)      //    
                    
                    self.currentVC = newVC
                }
            })
    
  • 하위 컨트롤러 중: 감청 전환 상태:
  •     //  , parent == nil
        override func willMove(toParentViewController parent: UIViewController?) {
            debugPrint("will move..parent=" + ((parent == nil) ? "nil" : "parent"))
        }
        
        //  , parent == nil
        override func didMove(toParentViewController parent: UIViewController?) {
            debugPrint("did move..parent=" + ((parent == nil) ? "nil" : "parent"))
        }
    

    좋은 웹페이지 즐겨찾기