UINavigationController: скрытие кнопки «Назад» в одном представлении скрывает его для всех представлений - PullRequest
13 голосов
/ 21 февраля 2011

У меня есть UINavigationController, который содержит 3 UIViewController в стеке.

View A - is the root
View B - is pushed by View A and has `self.navigationItem.hidesBackButton = YES;`
View C - is pushed by View B and has `self.navigationItem.hidesBackButton = NO;`

Вид C не отображает кнопку «Назад», даже если для hidesBackButton установлено значение NO. Как я могу решить эту проблему?

Ответы [ 9 ]

15 голосов
/ 21 февраля 2011

Обновление
Возможная ошибка в 4.2, поскольку она работает до 4.1 sdks

Я пробовал это, и мой работает отлично. Я просто размещаю реализацию контроллера представления B (BVC) и контроллера представления C (CVC). Я предполагаю, что вы не устанавливаете заголовок BVC в viewDidLoad.

@implementation BVC


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = @"I am B";
}


- (void) viewWillAppear:(BOOL)animated{
    self.navigationItem.hidesBackButton = YES;
}

- (IBAction)pushB:(UIButton *)sender{
    CVC *cvc = [[CVC alloc] initWithNibName:@"CVC" bundle:nil];
    [self.navigationController pushViewController:cvc animated:YES];
    [cvc release];
}
@end

@implementation CVC

- (void) viewWillAppear:(BOOL)animated{
    self.navigationItem.hidesBackButton = NO;
}
@end
8 голосов
/ 21 февраля 2011

Я думаю, вам нужно установить это свойство до , когда вы нажимаете или извлекаете контроллер представления, чтобы повлиять на следующий контроллер представления, установив его для текущего viewcontroller в viewWillAppear слишком поздно.

Редактировать: это похоже на ошибку в 4.2! Кнопка возврата остается скрытой как в симуляторе 4.2, так и на устройстве с 4.2, но она работает в симуляторах 3.2, 4.1 и 4.0!

Вот код, где при нажатии на ВК со скрытой кнопкой возврата:

- (IBAction) goto2nd
{
    SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease];
    vc.navigationItem.hidesBackButton = YES;
    [self.navigationController pushViewController:vc animated:YES];
}

Это все, что должно быть необходимо, каждый VC имеет собственный навигационный элемент, это не глобальная настройка, поэтому вам не нужно беспокоиться об его отмене для восстановления кнопки возврата (по крайней мере, при возврате к VC, где он установлено на «НЕТ»).

6 голосов
/ 10 марта 2011

Вот обходной путь, который я успешно использую на 4.3.

Вместо того, чтобы прятать кнопку «Назад», установите вид левой кнопки на пустой экран:

UIView *tmpView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *tmpButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tmpView];
[tmpView release];
self.navigationItem.leftBarButtonItem = tmpButtonItem;
[tmpButtonItem release];

Чтобы восстановить кнопку «Назад», просто установите для левой кнопки панели значение nil:

[self.navigationItem setLeftBarButtonItem:nil animated:YES];

Обновление: похоже, что ошибка ушла в 4.3.

Примечание. Несмотря на то, что ошибка, похоже, исправлена, я предпочитаю технику «пустого просмотра», поскольку она позволяет анимировать исчезновение и повторное появление кнопки «Назад».

1 голос
/ 26 февраля 2011

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

Сначала установите заголовок навигации в viewWillAppear.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationItem.title = @"SET YOUR TITLE";
}

Когда вы переходите на другую страницу, просто установите для заголовка навигации значение null. Это не покажет вам ни одну кнопку сверху. Так как вы можете избавиться от написания self.navigationItem.hidesBackButton = YES; каждый раз.

- (IBAction)pushB:(UIButton *)sender
{
    SecondVC *vc = [[[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil] autorelease];
    self.navigationItem.title = @"";
    [self.navigationController pushViewController:vc animated:YES];
    [vc release];
}
0 голосов
/ 02 марта 2011

Если ваша иерархия представления действительно такова, что View B должен не показывать кнопку возврата, а View C должен , то самый простой способ обойти это - реорганизовать вашу иерархию. Я думаю о следующей альтернативе:

View A вызывает presentModalViewController:animated: в View B *, a UINavigationController, свойство view которого равно View B. View B * помещает View C в свой стек навигации в ответ на событие (или иное) из View B. Если вам нужно вернуться к View A быстро, затем вызовите dismissModalViewControllerAnimated: для View A. Если вы хотите сохранить состояние View B * и C в памяти, то вы также можете хранить другой указатель на View B * где-нибудь, чтобы он не исчезал при отклонении.

0 голосов
/ 01 марта 2011

Вы также можете использовать следующий пример кода:

- (void) viewWillAppear:(BOOL)animated{
    self.navigationItem.hidesBackButton = YES;
}

- (void) viewWillDisappear:(BOOL)animated{
    self.navigationItem.hidesBackButton = NO;
}
0 голосов
/ 01 марта 2011

Используйте метод UINavigationControllerDelegate -navigationController:willShowViewController:animated:. Это будет реализовано в контроллере представления A и контроллере просмотра B. В A вы установите -hidesBackButton: на YES и, в качестве альтернативы, NO в контроллере просмотра B.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.hidesBackButton = YES;
}
0 голосов
/ 26 февраля 2011

У меня та же проблема, и она возникает только на симуляторе iOS 4.2, так что, вероятно, это ошибка в этой версии.

Reedit:

Попробуйте с этим, он работал дляя:

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    self.navigationItem.hidesBackButton = NO;
}
0 голосов
/ 21 февраля 2011

Когда вы вернетесь (как бы вы это ни делали), установите для свойства hidesBackButton значение YES.Например, в вашем методе viewWillAppear: сделайте что-то вроде

@implementation SomeViewController

- (void) viewWillAppear:(BOOL)animated {
    self.navigationController.navigationItem.hidesBackButton = YES;
    [super viewWillAppear:animated];
}

@end

Я полагаю, это будет так просто, но я могу ошибаться.В конце концов, элемент навигации принадлежит UINavigationController, поэтому для меня имеет смысл, что внесенные в него изменения не будут сохранены / восстановлены в зависимости от того, какой UIViewController находится в стеке UINavigationController.

...