Как я могу проверить, существует ли дочерний контроллер представления - PullRequest
0 голосов
/ 28 января 2019

Я реализую слайд в меню стилей.

Меню добавляется в качестве дочернего контроллера представления на шоу, а затем анимируется в виде.Затем я удаляю его из вида после его закрытия.

Я хотел бы ввести UIPanGestureRecognizer, чтобы пользователь мог провести его пальцем по виду, однако логика добавления вида срабатывает только при нажатии клавиши open.

Я хотел бы избегать добавления его много раз и при каждом жесте, поэтому я подумал о том, чтобы проверить, присутствует ли он, если не добавить, то анимировать.

lazy var menu 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

    }

Но это не правильно.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете проверить classForCoder по имени вашего класса

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

Однако это вводит "волшебную строку", поскольку простое изменение имени класса нарушит эту логику.

0 голосов
/ 28 января 2019

Вы можете попробовать использовать childrens свойство vc

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...