Добавление к существующему UINavigationController в iOS / Swift

#ios #swift #xcode

#iOS #swift #xcode

Вопрос:

У меня есть существующий делегат контроллера навигации, который помещает кнопку меню на каждый контроллер представления в приложении.

 class MyNavigationControllerDelegate: NSObject, UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        let navItem = viewController.navigationItem
        let menuBtn = MyCustomMenuButton()
         ...
        navItem.setRightBarButton(menuBtn, animated: false)
}
  

Это отлично работает … я получаю кнопку меню в навигационной панели для каждого представления. Но для некоторых представлений я хотел бы добавить еще одну кнопку справа рядом с кнопкой меню, поэтому я добавил это:

 class CustomViewController: UIViewController, UINavigationControllerDelegate {

   override func viewDidLoad() {
        super.viewDidLoad()
        let newButton = UIBarButtonItem(title: "( )", style: .plain, target: nil, action: nil)
        self.navigationItem.rightBarButtonItem = newButton
   }
}
  

Но это не имеет никакого эффекта. Кнопка меню все еще там, но новая кнопка не добавлена. Как это должно быть сделано тогда?

Комментарии:

1. Я могу переопределить UINavigationControllerDelegate in CustomViewController , но это лучший / единственный способ?

Ответ №1:

Но это не имеет никакого эффекта

Да, это так. Но у вас нет времени, чтобы увидеть эффект. Вы говорите одно и то же дважды, потому setRightBarButtonItem что это то же rightBarButtonItem =... самое, что и то, что вы говорите вторым, это тот, который в конечном итоге выполняется; в любом случае, он удаляет существующий элемент кнопки правой панели и заменяет его другим.

Если цель состоит в том, чтобы иметь несколько элементов кнопки правой панели, rightBarButtonItems для этого и предназначен (обратите внимание на множественное число). Вместо этого вы можете вызвать setRightBarButtonItems (опять же, обратите внимание на множественное число). Конечно, вам нужно посмотреть, есть ли уже элемент кнопки правой панели, и принять это во внимание. Волшебного append метода не существует.

Комментарии:

1. Использование setRightBarButtonItems в файле делегата будет более тесно связывать этот делегат с этим конкретным контроллером представления, поэтому я стараюсь не указывать конкретный контроллер представления в делегате. Прямо сейчас для решения, которое работает, требуется дублировать код в контроллере представления, используемом setRightBarButtonItems там. Я думаю, это работает, но неаккуратно.

2. Ну, на данный момент я не знаю, о чем вы говорите. Вопрос заключался в том, почему вы видели только один элемент кнопки правой панели, и я объяснил это.

3. На самом деле, вопрос в том, «Как это должно быть сделано», а не «почему это происходит», но вы указали мне правильный путь, сказав: «Не существует волшебного метода добавления».