Кнопка "Бар" Элемент только в одной панели навигации контроллера панели вкладок

У меня есть контроллер панели вкладок с 4-мя контроллерами представлений, и этот контроллер панели вкладок находится в навигационном контроллере.

Я хочу отобразить UIBarButtonItem только для одного определенного контроллера представлений контроллера панели вкладок.

Я попытался использовать следующие

if (tabBarController.selectedViewController == customTourViewController)
    {
        [tabBarController.navigationItem setRightBarButtonItem:done];
    }

Но кнопка не отображается.

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

Можно ли каким-либо образом реализовать первое решение? Спасибо.

Ответ 1

В моих индивидуальных контроллерах представления для отдельных вкладок у меня есть следующее в том, которое нуждается в кнопке:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                    style:UIBarButtonSystemItemDone target:nil action:nil];
    self.tabBarController.navigationItem.rightBarButtonItem = rightButton;
}

И в контроллерах представления, которым не нужна кнопка, у меня есть:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.tabBarController.navigationItem.rightBarButtonItem = nil;
}

Итак, если он не работает для вас, я не уверен, что это ваша ссылка на tabBarController без обозначения self (если я опускаю self, я получаю ошибку компилятора). И где этот код, потому что если он находится в вашем подклассе tabBarController, то вы хотите self.navigationItem.rightBarButtonItem, правильно? У вас есть собственный ivar для этого имени переменной? Или вы уверены, что done определено правильно (т.е. Не nil)? Или вы уверены, что этот код вообще вызывается (возможно, установите точку останова или вставьте NSLog и убедитесь, что этот код достигнут)?

Ответ 2

В качестве альтернативы вы можете реализовать viewWillDisappear в том же представлении, где вам нужна кнопка.

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];        
    self.tabBarController.navigationItem.rightBarButtonItem = nil;
}

Ответ 3

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

Я добавил код ниже для контроллера представления, который требовал кнопку панели (я создал кнопку добавления для этого примера):

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

self.tabBarController?.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: nil)
}

В контроллерах представления, которые не требуют этой кнопки панели, просто добавьте код ниже

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

self.tabBarController?.navigationItem.rightBarButtonItem = nil
}

Вы используете viewWillAppear Vice viewDidAppear потому что вы хотите, чтобы кнопка панели появлялась каждый раз, когда пользователь обращается к назначенному контроллеру представления.

Проще говоря, viewDidAppear вызывается один раз во время выполнения, viewWillAppear будет вызываться при каждом посещении контроллера представления.