从另一个 ViewController 中删除子视图

Tim*_*Tim 0 ios swift

我将 PageViewController 添加到普通视图控制器作为viewDidAppear()HomeViewController 中的子视图,如下所示:

if showTutorial == false {
        addChild(controller)
        controller.view.frame = view.frame
        view.addSubview(controller.view)
        controller.didMove(toParent: self)
}
Run Code Online (Sandbox Code Playgroud)

它有效,但我不知道如何再次删除它- PageViewController 包含一个在其页面中导航的按钮。到达某个页面时,我想通过单击 PageViewController 内部的按钮再次从 HomeViewController 中删除 PageViewController。

我怎样才能这样做呢?

PageViewController 内部的按钮:

@objc func buttonAction(sender: UIButton!) {
    if currentTutorialPage != 4 {
        currentTutorialPage += 1
        self.setViewControllers([self.viewControllerList[currentTutorialPage]], direction: .forward, animated: false, completion: nil)
        view.bringSubviewToFront(nextButton)
        view.bringSubviewToFront(prevButton)
    } else {
        tutorialSeen = true
        defaults.set(tutorialSeen, forKey: "tutorialSeen")
    }
}
Run Code Online (Sandbox Code Playgroud)

Sh_*_*han 6

你可以试试

self.view.removeFromSuperview()
Run Code Online (Sandbox Code Playgroud)

为了完整起见,您可以使用此扩展

@nonobjc extension UIViewController {
    func add(_ child: UIViewController, frame: CGRect? = nil) {
        addChild(child)
        if let frame = frame {
          child.view.frame = frame
        }
        view.addSubview(child.view)
        child.didMove(toParent: self)
    }
    func remove() {
        willMove(toParent: nil)
        view.removeFromSuperview()
        removeFromParent() 
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

@objc func buttonAction(sender: UIButton!) {
    if currentTutorialPage != 4 {
        currentTutorialPage += 1
        self.setViewControllers([self.viewControllerList[currentTutorialPage]], direction: .forward, animated: false, completion: nil)
        view.bringSubviewToFront(nextButton)
        view.bringSubviewToFront(prevButton)
    } else {
        tutorialSeen = true
        defaults.set(tutorialSeen, forKey: "tutorialSeen")
        self.remove()
    }
}
Run Code Online (Sandbox Code Playgroud)