Swift Command, чтобы скрыть элемент кнопки панели в ViewController с действием в ContainerView?

У меня особый вопрос, на который я не нахожу ответа. У меня есть встроенный ViewController в контроллер навигации с представлением контейнера. В этом представлении контейнера есть scrollView. Я хочу сделать следующее: когда я прокручиваю свой ContainerView вниз, я хочу, чтобы элемент кнопки панели в NavigationContoller из моего ViewController исчез. Когда я прокручиваю вверх, он должен появиться снова.

Я могу скрыть всю панель навигации с помощью следующего кода, который находится в файле ContainerViewController.swift:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    print("123")
    if(velocity.y>0) {
        UIView.animate(withDuration: 0.5, delay: 0, options: UIView.AnimationOptions(), animations: {
            self.navigationController?.setNavigationBarHidden(true, animated: true)
            print("Hide")
        }, completion: nil)

    } else {
        UIView.animate(withDuration: 0.5, delay: 0, options: UIView.AnimationOptions(), animations: {
            self.navigationController?.setNavigationBarHidden(false, animated: true)
            print("Unhide")
        }, completion: nil)
      }

}

Есть ли аналогичный код, который только убирает элемент кнопки панели? Я не знаю, как получить доступ к элементу кнопки панели, потому что я не могу подключить его как выход к файлу ContainerViewController.swift, а только к файлу ViewController.swift.

Надеюсь, вы понимаете мой вопрос и можете на него ответить.


person Lukas    schedule 14.04.2020    source источник


Ответы (2)


Только ViewController может изменять содержимое панели навигации, изменяя содержимое своего собственного navigationItem. Таким образом, вам нужно будет отправить сообщение из ContainerViewController в ViewController (его parent), и ViewController будет делать все, что угодно, со своим navigationItem.

person matt    schedule 14.04.2020
comment
«Спасибо», - подумал я, но я не знаю, как определить, что что-то было отправлено в мой ViewController. Есть ли что-то вроде функции переопределения, где я могу это сделать? Извините, я новичок в Swift. - person Lukas; 14.04.2020

Вы можете получить доступ к элементам кнопок панели вашего контроллера навигации через свойство navigationItem navigationController. Например, если вы хотите скрыть элемент кнопки левой панели, просто установите navigationController?.navigationItem.leftBarButtonItem.isHidden = true.

person Dreamsparkx3    schedule 14.04.2020
comment
Спасибо, но в моем случае это не работает, потому что я выполняю действие в представлении контейнера, но я хочу получить доступ к своему ViewController, где находится элемент панели навигации. - person Lukas; 14.04.2020
comment
Вы можете использовать протоколы / синглтон для доступа к вашему ViewController, а затем скрыть / показать свою кнопку. Или даже сделайте то же самое, но вместо ViewController сделайте это для своего NavigationController. Таким образом, вы можете управлять кнопкой возврата, где хотите. - person Daniel Arantes Loverde; 15.04.2020
comment
Теперь я понимаю, что вы имели в виду. Вы можете получить доступ к правильному элементу навигации с помощью parent.navigationItem, где parent - это контроллер представления, в который вы поместили представление контейнера. Тогда вы сможете получить доступ ко всем элементам кнопок панели. Но поскольку они являются прокси-объектами, вы не можете установить isHidden. Вы можете либо удерживать сильную ссылку на элемент и установить для элемента navigationItems barButton значение nil и переназначить его при необходимости, либо просто установить текст элемента кнопки панели на. - person Dreamsparkx3; 16.04.2020