#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
inCustomViewController
, но это лучший / единственный способ?
Ответ №1:
Но это не имеет никакого эффекта
Да, это так. Но у вас нет времени, чтобы увидеть эффект. Вы говорите одно и то же дважды, потому setRightBarButtonItem
что это то же rightBarButtonItem =...
самое, что и то, что вы говорите вторым, это тот, который в конечном итоге выполняется; в любом случае, он удаляет существующий элемент кнопки правой панели и заменяет его другим.
Если цель состоит в том, чтобы иметь несколько элементов кнопки правой панели, rightBarButtonItems
для этого и предназначен (обратите внимание на множественное число). Вместо этого вы можете вызвать setRightBarButtonItems
(опять же, обратите внимание на множественное число). Конечно, вам нужно посмотреть, есть ли уже элемент кнопки правой панели, и принять это во внимание. Волшебного append
метода не существует.
Комментарии:
1. Использование
setRightBarButtonItems
в файле делегата будет более тесно связывать этот делегат с этим конкретным контроллером представления, поэтому я стараюсь не указывать конкретный контроллер представления в делегате. Прямо сейчас для решения, которое работает, требуется дублировать код в контроллере представления, используемомsetRightBarButtonItems
там. Я думаю, это работает, но неаккуратно.2. Ну, на данный момент я не знаю, о чем вы говорите. Вопрос заключался в том, почему вы видели только один элемент кнопки правой панели, и я объяснил это.
3. На самом деле, вопрос в том, «Как это должно быть сделано», а не «почему это происходит», но вы указали мне правильный путь, сказав: «Не существует волшебного метода добавления».