Ответ 1
То, что вы делаете, должно работать. Я делал это много раз. Вы уверены, что удаляете кнопку из правильного элемента навигации? Является ли self
отображаемым в данный момент UIViewController
?
Я добавил элемент кнопки правой панели в свой элемент навигации и хочу удалить это при некоторых условиях. Это то, что я делаю:
self.navigationItem.rightBarButtonItem = nil;
Но не получите желаемого поведения.
Я хочу скрыть его, но не найду для него никакого метода.
То, что вы делаете, должно работать. Я делал это много раз. Вы уверены, что удаляете кнопку из правильного элемента навигации? Является ли self
отображаемым в данный момент UIViewController
?
Я знаю три способа: (суппозиция в правой части)
если у вас более одной кнопки на панели: self.navigationItem.rightBarButtonItems = nil
else, если у вас есть только одна кнопка на панели
self.navigationItem.rightBarButtonItem = nil
установите кнопку nil: self.navigationItem.setRightBarButtonItem(nil, animated: false)
Swift 5/4/3 - у меня есть пара кнопок слева и справа от панели навигации, поэтому я скрываю их, используя:
func hideNavItems() {
navigationItem.setLeftBarButtonItems(nil, animated: true)
navigationItem.setRightBarButtonItems(nil, animated: true)
}
В моем случае мне нужно снова показать эти кнопки позже, поэтому я храню их в массиве:
var leftNavItems: [UIBarButtonItem]!
var rightNavItems: [UIBarButtonItem]!
а затем я просто вызываю функцию, чтобы показать (повторно добавить) их:
func showNavItems() {
navigationItem.setLeftBarButtonItems(leftNavItems, animated: true)
navigationItem.setRightBarButtonItems(rightNavItems, animated: true)
}
Я решил это, создав новый rightBarButtonItem.
Создать свойство:
@property (nonatomic, strong) UIBarButtonItem *clearRightButtonItem;
Synthesize:
@synthesize clearRightButtonItem = _clearRightButtonItem;
Создать приемник:
- (UIBarButtonItem *) clearRightButtonItem {
if (_clearRightButtonItem == nil) {
UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 38, 38)];
[rightButton setImage:nil forState:UIControlStateNormal];
_clearRightButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightButton];
}
return _clearRightButtonItem;
}
И затем установите для параметра rightBarButtonItem новый элемент clearRightButtonItem:
self.rightButtonItem = self.clearRightButtonItem;
Мой ответ не относится конкретно к этому вопросу, но поскольку это лучший результат для google, я буду вносить свой вклад в проблему
Я использовал массив элементов для rightBarButtonItem, поэтому каким-то образом используя
self.navigationItem.rightBarButtonItem = nil;
не работал у меня, поэтому я сделал пустой элемент barbutton и установил его как rightBarButtonItem, используя
[self.navigationItem setRightBarButtonItems:@[self.clearRightButtonItem]];
и теперь его нет.
Недавно я столкнулся с той же проблемой, и я решил ее (спасибо Эрику Б., ваш ответ вдохновил меня, к сожалению, я не могу проголосовать за ваш ответ)
Я думаю, что моя кнопка правого бара не может исчезнуть, потому что я назвал его в функции viewWillAppear
, и при этой функции self
не относится к текущему UIViewController
.
Это сработало для меня, вместо того, чтобы устанавливать кнопку в viewWillAppear
, я установил ее в функции navigationController:willShowViewController:animated:
в предыдущем UIViewController
.
Например, я вызываю SecondViewController
из FirstViewController
, и я хочу скрыть правую кнопку в SecondViewController
, поместите это в FirstViewController.m
:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ([viewController isKindOfClass:[SecondViewController class]]) {
[viewController.navigationItem setRightBarButtonItem:nil];
}
}
У меня возникла эта проблема при добавлении навигационной панели в контроллер представления, который фактически не встроен в контроллер навигации. В этом случае self.navigationItem не является правильным объектом для удерживания кнопок панели. То, что я нашел, работает (хотя вы, вероятно, должны просто встроить viewcontroller в контроллер навигации), необходимо создать свойство для панели навигации, добавленной в Interface Builder, и связать ее как обычно. В этом случае я назвал его "navBar".
Затем вы должны получить навигационный элемент navBar вместо элемента навигации для просмотра. В этом случае этот код работает:
UINavigationItem *item = [self.navBar.items objectAtIndex:0];
item.rightBarButtonItem = nil;
Он работал у меня со следующим кодом:
self.navigationItem?.rightBarButtonItem = nil
navigationBar.items = [self.navigationItem!]
if let nav = self.navigationController {
nav.navigationItem.setRightBarButtonItems(nil, animated: true)
nav.navigationBar.topItem?.rightBarButtonItems = []
}
Для других: я тоже пробовал
self.navigationItem.rightBarButtonItem = nil;
и это не сработало, тогда я заметил, что я не вызывал это из основного потока.