如何检查子视图控制器是否存在

Tim*_*m J 3 uiviewcontroller ios swift

我正在实现样式菜单中的幻灯片。

菜单在显示时添加为子视图控制器,然后动画显示到视图中。然后,在关闭后我将其从视图中删除。

我想引入一个,UIPanGestureRecognizer以便用户可以将其滑动到视图中,但是添加视图的逻辑仅在按下打开时才会触发。

我想避免在每个手势上多次添加它,所以我想检查它是否存在,如果不添加它,则设置动画。

惰性变量 menuController = MenuController()

private var menuWidth: CGFloat = 300
private let keyWindow = UIApplication.shared.keyWindow

override func viewDidLoad() {
    super.viewDidLoad()

    setupNavigationItems()
    setupTableView()

    menuController.view.frame = CGRect(x: -menuWidth, y: 0, width: menuWidth, height: view.frame.height)

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
    view.addGestureRecognizer(panGesture)

}

@objc func handlePan(gesture: UIPanGestureRecognizer) {


    let translation = gesture.translation(in: view)
    let transform = CGAffineTransform(translationX: translation.x, y: 0)
    menuController.view.transform = transform
    navigationController?.view.transform = transform

}

@objc func handleOpen() {
    keyWindow?.addSubview(menuController.view)
    animateMenuController(transform: CGAffineTransform(translationX: self.menuWidth, y: 0)) { }

    addChild(menuController)

}

@objc func handleHide() {
    animateMenuController(transform: .identity) { [weak self] in
        self?.menuController.view.removeFromSuperview()
        self?.menuController.removeFromParent()
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能做这样的事情

    @objc func handlePan(gesture: UIPanGestureRecognizer) {

        if view.subviews.contains(MenuController) {
            print("yes")
        }


        let translation = gesture.translation(in: view)
        let transform = CGAffineTransform(translationX: translation.x, y: 0)
        menuController.view.transform = transform
        navigationController?.view.transform = transform

    }
Run Code Online (Sandbox Code Playgroud)

但这是不正确的。

Sh_*_*han 6

你可以尝试使用childrensvc的属性

if !children.isEmpty { // this assumes 1 vc tell if you have more
   print("YES")  
}
Run Code Online (Sandbox Code Playgroud)

或者

if let _ = children.first(where:{ $0 is menuController})  {  // this assumes 1 vc tell if you have more
   print("YES")  
}
Run Code Online (Sandbox Code Playgroud)

您可能还需要将其添加到

 view.addSubview(menuController.view)
Run Code Online (Sandbox Code Playgroud)

keyWindow