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

3

我正在实现一个滑动式菜单。

菜单作为子视图控制器添加到显示中,然后以动画方式进入视图。一旦关闭,我会将其从视图中移除。

我想引入一个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()
    }
}

我希望能做类似这样的事情

    @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

    }

但这是不正确的。


1
使用控制器的self.children.contains(MenuController)属性。 - SPatel
2个回答

6
你可以尝试使用vc的childrens属性。
if !children.isEmpty { // this assumes 1 vc tell if you have more
   print("YES")  
}

或者

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

你可能还需要将其添加到

 view.addSubview(menuController.view)

不要使用keyWindow

假设这种情况,如果我在主视图控制器中添加了多个子视图控制器,你的条件是否仍然成立? - Anbu.Karthik
如果使用 count 而不是 isEmpty,那么处理方式将会有所不同。如果必要的话,编辑应该会产生影响。 - Shehata Gamal
是的,我同意 isEmpty 是必须的,但是如何知道它是否已经添加了 menuController 呢? - Anbu.Karthik
1
明确知道你的意思,但上面的代码是使用OP需要的VC,因此任何其他假设都应适当处理。 - Shehata Gamal
1
我喜欢你的解决方案@Sh_Khan,根据OP的建议,如果要求更复杂,OP应该更新他们的帖子以反映这一点。 - nodediggity

4
您可以将classForCoder与您的类名进行比较。
if children.first(where: { String(describing: $0.classForCoder) == "MenuController" }) != nil {
    print("we have one")
}

这样做会引入一个"魔法字符串",因为简单地更改您的类名将会使这个逻辑破坏。

我感谢你的回答。 - Anbu.Karthik
nodediggity 抱歉,我没有注意到你也在添加答案(投票)。 - Shehata Gamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接