Як приховати кнопку "назад" в 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.