добавить дочерний UIViewConroller в UITabBarController - PullRequest
0 голосов
/ 16 ноября 2018

структура моего приложения следующая:

UITabBarController -> UINavigationController -> [UIViewController1, UIViewController2, UIViewController3]

Мне нужно показать и скрыть дочерний UIViewController чуть выше tabBar в небольшом кадре, чтобы он был виден над всеми контроллерами в стеке навигации. Поэтому, когда пользователь перемещается по стеку туда и обратно, если этот дочерний элемент добавлен, он должен быть виден на всех контроллерах.

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

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

Есть ли у кого-нибудь предложения о том, как сохранить этот дочерний контроллер на протяжении всего процесса навигации.

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

Спасибо

1 Ответ

0 голосов
/ 16 ноября 2018

Я предполагаю, что вы добавили представление контейнера программно в свой контроллер панели вкладок, а затем добавили дочерний контроллер представления в это представление контейнера. Я прав?

В этом случае контроллер вкладок добавил дочерний контроллер в свой массив viewControllers.

Вы можете решить эту проблему, позвонив по номеру viewControllers?.removeLast() сразу после добавления вашего ребенка.

Этот код работал для меня:

override func viewDidLoad() {
    super.viewDidLoad()

    let containerView = UIView()
    view.addSubview(containerView)

    containerView.translatesAutoresizingMaskIntoConstraints = false
    containerView.bottomAnchor.constraint(equalTo: tabBar.topAnchor).isActive = true
    containerView.leftAnchor.constraint(equalTo: tabBar.leftAnchor, constant: 40).isActive = true
    containerView.rightAnchor.constraint(equalTo: tabBar.rightAnchor, constant: -40).isActive = true
    containerView.heightAnchor.constraint(equalToConstant: 150).isActive = true

    if let childVC = self.storyboard?.instantiateViewController(withIdentifier: "ChildViewController") {
        addChild(childVC)
        containerView.addSubview(childVC.view)
        childVC.didMove(toParent: self)

        childVC.view.translatesAutoresizingMaskIntoConstraints = false
        childVC.view.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
        childVC.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
        childVC.view.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
        childVC.view.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true

        if let childIndex = viewControllers?.firstIndex(of: childVC) {
            viewControllers?.remove(at: childIndex)
        }
    }
}

Здесь вместо простого вызова removeLast() я проверил, действительно ли childVC был в этом массиве. Просто чтобы быть на более безопасной стороне.

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