如何检查子视图控制器是否存在
How can I check if a child view controller exists
我正在实现样式菜单中的幻灯片。
菜单被添加为显示的子视图控制器,然后以动画形式进入视图。然后我在它关闭后将其从视图中删除。
我想介绍一个 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
}
但这是不正确的。
你可以尝试使用childrens
属性的vc
if !children.isEmpty { // this assumes 1 vc tell if you have more
print("YES")
}
或
if let _ = children.first(where:{ [=11=] is menuController}) { // this assumes 1 vc tell if you have more
print("YES")
}
您可能还需要将其添加到
view.addSubview(menuController.view)
不会keyWindow
您可以根据您的 class 姓名检查 classForCoder
if children.first(where: { String(describing: [=10=].classForCoder) == "MenuController" }) != nil {
print("we have one")
}
这确实引入了 "magic string",但是因为简单地更改您的 class 名称会破坏此逻辑。
我正在实现样式菜单中的幻灯片。
菜单被添加为显示的子视图控制器,然后以动画形式进入视图。然后我在它关闭后将其从视图中删除。
我想介绍一个 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
}
但这是不正确的。
你可以尝试使用childrens
属性的vc
if !children.isEmpty { // this assumes 1 vc tell if you have more
print("YES")
}
或
if let _ = children.first(where:{ [=11=] is menuController}) { // this assumes 1 vc tell if you have more
print("YES")
}
您可能还需要将其添加到
view.addSubview(menuController.view)
不会keyWindow
您可以根据您的 class 姓名检查 classForCoder
if children.first(where: { String(describing: [=10=].classForCoder) == "MenuController" }) != nil {
print("we have one")
}
这确实引入了 "magic string",但是因为简单地更改您的 class 名称会破坏此逻辑。