Как скрыть кнопку «назад» в 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.