Как скрыть кнопку «назад» в UINavigationController?


158

Знаете ли вы, как скрыть кнопку «назад» в UINavigationController? Кроме того, как показать это обратно, но я думаю, что это очень похоже на сокрытие этого ...

Так же, как почтовое приложение на iPhone, когда вы нажимаете «Редактировать» при просмотре электронной почты.

Ответы:


313

Я только что узнал ответ, в контроллере используйте это:

[self.navigationItem setHidesBackButton:YES animated:YES];

И восстановить это:

[self.navigationItem setHidesBackButton:NO animated:YES];

-

[ОБНОВИТЬ]

Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)

18
Также учитесь на моей ошибке: вы должны вызывать setHidesBackButton:ПЕРЕД тем, как вы вставляете навигационный элемент в навигационный контроллер.
codingFriend1

почему раньше? Что делать, если вы хотите нажать viewController, а затем скрыть кнопку «Назад», чтобы предотвратить возврат пользователя?
user4951

1
@codingFriend - я считаю, что это также работает, если вы поместите setHidesBackButton в обработчик сообщений viewDidAppear представления, для которого вы не хотите показывать кнопку.
Anon

2
Лучшие события для этого - viewWillAppear:animatedспрятать и viewWillDisappear:animatedвосстановить.
Печар

Наконец то, что Apple не изменила в Xcode. Более 5 лет спустя, и этот ответ по-прежнему прекрасно работает.
App Dev Guy


22

Помимо удаления кнопки «назад» (с использованием уже рекомендованных методов), не забывайте, что пользователь все еще может «всплыть» к предыдущему экрану жестом смахивания слева направо в iOS 7 и более поздних версиях.

Чтобы отключить это (при необходимости), реализуйте следующее (например, в viewDidLoad):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;

1
Мэтт - +1 для вас. Спасибо за добавление этой заметки. Очень полезно. Для тех, кто интересуется, как работает поп-жест, просто проведите слева направо на панели навигации, чтобы воссоздать то, что Мэтт описывает здесь. Добавление приведенного выше кода не позволяет пользователю делать это на контроллере представления, где он включен.
noobzilla

18

Просто чтобы уточнить существующие ответы: hidesBackButtonсвойство является правильным ответом, но во многих ответах неясно, что selfотносится к. По сути, вы должны установить self.navigationItem.hidesBackButton = YESв контроллере представления, который собирается получить (или просто получить) на UINavigationController.

Другими словами, скажи, что у меня есть UINavigationControllerимя myNavController. Я хочу по-новому взглянуть на него, и когда я это сделаю, я не хочу, чтобы кнопка «Назад» больше отображалась. Я мог бы сделать что-то вроде:

UIViewController *newVC = [[UIViewController alloc] init];
//presumably would do some stuff here to set up the new view controller
newVC.navigationItem.hidesBackButton = YES;
[myNavController pushViewController:newVC animated:YES];

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


Именно то, что мне было нужно, так как я впервые делал NavigationController.NavigationItem. Спасибо Мэтт.
Чаки

16

Для условного скрытия и отображения кнопки «Назад» вы можете использовать следующий код:

-(void)viewDidAppear:(BOOL)animated
{
    if ([tempAry count]==0)
    {
        [self.navigationItem setHidesBackButton:YES animated:YES];
    }
    else
    {
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
    [super viewDidAppear:animated];
} 

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


11

Swift iOS (я использовал следующее)

// hide back button
        self.navigationItem.setHidesBackButton(true, animated: false)

// pgrm mark ----- ------

    // hide the back button for this view controller

    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        self.navigationItem.setHidesBackButton(editing, animated: animated)

    }// end setEditing

10

Sethidesbackbutton не работает для меня по некоторым причинам

Я использовал этот способ ->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;

спасибо .. У меня была та же проблема, где setHidesBackButton: ДА не работал. но это решение работало для iOS 7.
mohsinj

7

Всегда используйте документацию Apple для простых вопросов, они более просты и легки :)

Вот синтаксис для Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)

Ссылка

https://developer.apple.com/reference/uikit/uinavigationitem#//apple_ref/occ/instm/UINavigationItem/setHidesBackButton:animated:


Удалять ; в Swift :)
Маркус Раутопуро

6

В моем случае у меня было несколько вопросов с текущими ответами:

  • внутри viewDidLoad / viewWillAppear был скрыт только значок возврата, а строка «Назад» была неактивной, но все еще видимой
  • внутри viewDidAppear исчезла кнопка "назад" ... но я не хотел, чтобы пользователь вообще ее видел

Итак, решение, которое наконец-то сработало для меня:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        [self.navigationItem setHidesBackButton:YES animated:NO];
    }

    return self;
}

3

Решение, предложенное Зораном Симичем, почему-то не сработало для меня.

Этот код работал, однако:

MyController* controller   =   [[MyController alloc]  init];
NSArray* array             =   [[[NSArray alloc] initWithObjects:controller, nil] autorelease];

[self.navigationController setViewControllers:array animated:NO];

[controller release];

Очевидно, вам придется манипулировать NSArray на свой вкус, чтобы он работал на вас. Надеюсь, это поможет кому-нибудь :)


Спасибо за это! Я боролся со странной ошибкой, и это помогло. Не для всех, но полезно в нужных случаях.
Брэндон

1

В моем подклассе UIViewController у меня есть этот метод:

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

    // hide back button in edit mode
    [self.navigationItem setHidesBackButton:editing animated:YES];
}

0

Это скрывает кнопку «Назад» и заменяет ее кнопкой «Добавить» в Swift:

override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // This hides the back button while in editing mode, which makes room for an add item button
    self.navigationItem.setHidesBackButton(editing, animated: animated)

    if editing {
        // This adds the add item button
        let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
        // Use the animated setter for the left button so that add button fades in while the back button fades out
        self.navigationItem.setLeftBarButton(addButton, animated: animated)
        self.enableBackGesture(enabled: false)
    } else {
        // This removes the add item button
        self.navigationItem.setLeftBarButton(nil, animated: animated)
        self.enableBackGesture(enabled: true)
    }
}

func enableBackGesture(enabled: Bool) {
    // In addition to removing the back button and adding the add item button while in edit mode, the user can still exit to the previous screen with a left-to-right swipe gesture in iOS 7 and later. This code disables this action while in edit mode.
    if let navigationController = self.navigationController {
        if let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
            interactivePopGestureRecognizer.isEnabled = enabled
        }
    }
}

0

Свифт 3.

Как правило, вы должны использовать API-интерфейс per-ViewController от Apple, как уже много раз описывалось на этой странице, но иногда вам требуется немедленный контроль над кнопкой «Назад».

Следующий код скрывает кнопку «Назад» и гарантирует, что в зоне скрытой кнопки не будет обнаружено обнаружения столкновения.

let emptyView = UIView(frame: .zero)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)

0

Это скрывает кнопку назад

let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil)


navigationItem.leftBarButtonItem = backBtn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.