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

Posted

技术标签:

【中文标题】如何检查子视图控制器是不是存在【英文标题】:How can I check if a child view controller exists如何检查子视图控制器是否存在 【发布时间】:2019-01-28 12:48:45 【问题描述】:

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

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

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

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

懒惰的 var 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

    

但这是不正确的。

【问题讨论】:

使用控制器的子属性self.children.contains(MenuController) 【参考方案1】:

您可以对照您的班级名称检查classForCoder

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

这确实引入了一个“魔术字符串”,但是因为简单地更改你的类名会破坏这个逻辑。

【讨论】:

感谢您的回答 nodediggity 抱歉没有注意到您也在哪里添加答案(已投票)【参考方案2】:

你可以尝试使用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

【讨论】:

假设这种情况,如果我在 main 中添加多个 ChildVC,您的条件将满足..? @Anbu.Karthik 那么处理将与 count 而不是 isEmpty 不同,必要时编辑应该产生后果 是的,我同意 isEmpty 是强制性的,但是如何知道它是否包含 menuController 是否添加 明明知道什么意思,但是上面的代码是用了op需要的vc,那么其他任何假设都应该适当处理 我喜欢你的解决方案@Sh_Khan,根据 OP 的建议,这应该可行,如果要求更复杂,OP 应该更新他们的帖子以反映这一点

以上是关于如何检查子视图控制器是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查视图而不是 viewController 是不是可见?

如何检查 UIView 是不是仍然存在?

如何检查视图控制器是不是添加到堆栈中

Swift ios 检查存在哪个视图控制器

如何检查具有指定标识符的视图控制器是不是可用

如何检查视图控制器是不是已在 Swift 中关闭