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

Ios 如何检查子视图控制器是否存在,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,我正在实现一个滑入式菜单 菜单在显示时作为子视图控制器添加,然后在视图中设置动画。关闭后,我将其从视图中删除 我想介绍一个UIPangestureRecognitor,这样用户可以将其滑动到视图中,但是添加视图的逻辑只有在按open时才会触发 我想避免在每个手势上多次添加它,所以我想检查它是否存在,如果没有添加,然后设置动画 惰性变量menuController=menuController private var menuWidth: CGFloat = 300 private let key

我正在实现一个滑入式菜单

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

我想介绍一个UIPangestureRecognitor,这样用户可以将其滑动到视图中,但是添加视图的逻辑只有在按open时才会触发

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

惰性变量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()
    }
}
我希望做这样的事

    @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

    }
但这是不正确的。

您可以尝试使用vc的childrens属性

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

您可能还需要将其添加到

 view.addSubview(menuController.view)
不要使用keyWindow,您可以尝试使用vc的childrens属性

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

您可能还需要将其添加到

 view.addSubview(menuController.view)
不使用keyWindow

您可以根据类名检查classForCoder

if children.first(where: { String(describing: $0.classForCoder) == "MenuController" }) != nil {
    print("we have one")
}
不过,这确实引入了一个神奇的字符串,因为简单地更改类名会破坏这种逻辑。

您可以对照类名检查classForCoder

if children.first(where: { String(describing: $0.classForCoder) == "MenuController" }) != nil {
    print("we have one")
}

但是,这确实引入了一个神奇的字符串,因为简单地更改类名就会破坏这种逻辑。

使用控制器的子属性self.children.containsMinuControllerUse控制器的子属性self.children.containsMinuControllerUse此场景,如果我在main中添加多个ChildVC,您的条件将满足..?@Anbu.Karthik,那么处理将与count不同,而不是isEmpty,必要时编辑应产生后果。我同意isEmpty是强制性的,但如何知道它包含添加的menuController,或者不清楚您的意思,但是上面的代码使用的是op需要的vc,那么任何其他假设都应该得到适当的处理I like you solution@Sh_Khan,根据op的建议,这应该是可行的,如果需求更复杂,op应该更新他们的帖子来反映这个假设这个场景,如果我在main中添加多个ChildVC,您的条件将满足..?@Anbu.Karthik,那么处理将与count不同,而不是isEmpty,必要时编辑应产生后果。我同意isEmpty是强制性的,但如何知道它包含添加的menuController,或者不清楚您的意思,但是上面的代码使用的是op需要的vc,那么任何其他假设都应该得到适当处理I like you solution@Sh_Khan,根据op的建议,如果需求更复杂,这应该有效,OP应该更新他们的帖子以反映这一点我感谢你的回答很抱歉没有注意到你也在哪里投票添加答案我感谢你的回答很抱歉没有注意到你也在哪里投票添加答案