Як приховати кнопку "назад" в 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 у вікні подання, на якому ви не хочете показувати кнопку зворотного зв'язку.
— Анон

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

Швидкий 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


6

У моєму випадку у мене було кілька питань із поточними відповідями:

  • всередині viewDidLoad / viewWillAppear only back icon було приховано, а рядок "Назад" був неактивним, але все ще видно
  • всередині 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.