Пользовательская кнопка возврата UINavigationBar без заголовка


231

Как я могу настроить кнопку навигации назад в iOS 7 и выше без заголовка? (т.е. только со стрелкой)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Мне просто интересно, есть ли у них self.backButtonItem;

ИЛИ

что-то вроде этого?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
Вы можете использовать @hiroshi answer + свойство навигации tintColor для создания шеврона с произвольным цветом и без заголовков
Дмитрий Жуков

Для тех, у кого есть панель вкладок, и вам не нужен текст кнопки «Назад», исправление: в viewDidLoad () TabBarController добавьте: self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style:. обычный, цель: ноль, действие: ноль)
Борж

Ответы:


313

Это на самом деле довольно легко, вот что я делаю:

Цель С

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

Swift 2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

Свифт 3

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Поместите эту строку в контроллер представления, который помещается в стек ( предыдущий контроллер представления ). Недавно нажатая кнопка назад контроллера представления покажет все, что вы положили для initWithTitle, который в данном случае является пустой строкой.


3
Я использовал это, но название приходит и исчезает в анимации ??
user1010819

7
Спасибо Кайл! Я искал способ переименовать кнопку возврата по умолчанию в iOS 7. Я поместил это в свой prepareForSegueв контроллере представления, и он работал отлично.
Yiwei

1
@ user1010819 Это ожидаемое поведение, barButtonItems будет анимировать вход и выход при переключении контроллеров представления. Что вы пытаетесь достичь?
Кайл Бегеман

1
@YiweiGao Нет проблем! Это просто еще одна из тех вещей, которые, если вы знаете правильный код, это довольно просто! Я рад, что это помогло!
Кайл Бегеман

3
Я чувствую, что это нуждается в обновлении, просто сейчас ничего не показывает, стрелка там не по умолчанию?
Матийс Сегерс

198

Я нашел простой способ сделать мою кнопку возврата с iOS одной стрелкой.

Давайте предположим, что у вас есть навигационный контроллер, идущий в ViewA из ViewB. В IB выберите панель навигации ViewA, вы должны увидеть следующие опции: Заголовок, Подсказка и Кнопка Назад.

Параметры панели навигации ViewA

Параметры панели навигации ViewA

Хитрость заключается в выборе заголовка кнопки «Назад» (ViewB) в контроллере вида судьбы в настройках предыдущего контроллера («Вид А»). Если вы не заполните опцию «Кнопка назад», iOS автоматически поставит заголовок «Назад», с предыдущим контроллера. Итак, вам нужно заполнить эту опцию одним пробелом.

Заполните пробел в опции «Кнопка назад»

Заполните пробел в опции «Кнопка назад»

Результат:

Результат:


Добро пожаловать в переполнение стека . Если вы еще не сделали, посмотрите на то , что мы тур , и прочитать некоторые из статей в Справочном центре о том , как мы работаем , и некоторые из общественных обычаев здесь. Если вам нужна помощь с функциями сайта, не бойтесь искать, а затем задайте вопрос о переполнении стека мета (если вы все еще не можете найти ответ). Спасибо и удачи! Во всяком случае, вы можете опубликовать свои изображения сейчас ... :)
Qantas 94 Heavy

53
это работает, просто обратите внимание - вам нужно установить кнопку "Назад" для предыдущего контроллера (например, для rootViewController в вашем контроллере навигации)
evfemist

Убедитесь, что для элемента навигации hidesBackButton установлено значение TRUE в элементе навигации в ViewA
шайбы

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

1
для меня это работает только тогда , когда как источника и назначения ViewController в NavigationItem естьBack Button установлен один пробел (т.е. как ViewA и ViewB)
dcestari

72

Просто используйте изображение!

OBJ-C :

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

SWIFT 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-back.png

Icon-Back

Icon-Back@2x.png

Icon-Back @ 2x

Icon-Back@3x.png

Icon-Back @ 23x


4
С этим решением вы, кажется, теряете функциональность «проведите назад».
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfделает трюк, чтобы держать жест спиной назад
Виктор Кармуз

Я искал этот ответ, возможно, всю свою жизнь, а именно селектор действий.
Des

29

В iOS7 появились новые правила интерфейса, поэтому лучше сохранить хотя бы стрелку назад, когда вы нажимаете UIView. Изменить текст «назад» очень просто программно. Просто добавьте этот код, прежде чем отправлять представление (или prepareForSegue, если вы используете StoryBoards):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

Это изменит текст «Назад» по умолчанию, но сохранит стрелку назад в стиле iOS7. Вы также можете изменить цвет оттенка для стрелки назад, прежде чем нажимать вид:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

Надеюсь, это поможет вам!


2
Это работает очень хорошо и кажется лучше, чем другие варианты. Например, заголовок никогда не нужно сбрасывать на предыдущее значение, в отличие от некоторых других ответов.
pr1001

26

Ничего особенного вам не нужно делать. Вы можете достичь того же самого через раскадровку.

Просто зайдите в корневой навигационный контроллер и оставьте пробел. Помните не для контроллера, который вы хотели кнопку назад без заголовка, но для корневого контроллера навигации.

Согласно изображению ниже.  Это работает для iOS 7 и iOS 8


Я попробовал, это работает. Но я все еще не могу изменить заголовок в коде.
Ю-Лин Ван

Работал с XCode7, но больше не работает в xCode8 -> ios10.X, я использовал метод
@iwasrobbed

Все гениально просто!
Илья Крит

22

Несмотря на то, что ответ Кайла Бегемана полностью помогает, довольно досадно иметь этот код в каждом возможном контроллере представления. Я закончил с простой UINavigationItemкатегорией. Осторожно, здесь будут драконы! Извините, я имею в виду

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
Я проголосовал, но затем решил использовать вместо этого более простой взлом - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( источник ) - может быть немного менее элегантно, но излишнее чувство ощущалось излишним
dmur

2
Серьезно, вы все ... не переходите на другое решение. Реализуйте решение @nicky, опубликованное как Категория, и не думайте дважды. Это отличное решение для повторного использования, которое может быть реализовано во всем приложении, если вы добавите этот файл Prefix.pch. Apple рекомендует использовать категории для добавления методов в существующие классы, и вы должны использовать это, когда это возможно.
zmonteca

Это лучшее решение, на мой взгляд, в любом случае, «method_exchangeImplementation» немного небезопасно, взгляните на это: « Правильный путь к извращению» и это руководство по NSHipster по извращению
Алессандро Орр

@ AlessandroOrrù В данном конкретном случае это должно быть безопасно, поскольку метод Swizzled - UINavigationItemэто очень собственный метод, в котором нет наследования. И _cmdвряд ли будет вовлечен в добытчик. В любом случае, это хороший момент. Так что, если у вас есть какой-либо из этих многочисленных помощников в вашем проекте, убедитесь, что вы используете его и здесь.
secondcitysaint

21

РЕДАКТИРОВАТЬ: 2014-04-09: Поскольку я получил репутацию, мне жаль, потому что я больше не использую этот трюк. Я рекомендую ответ Кайла. Также обратите внимание , что selfиз self.navigationItem.backBarButtonItemне - контроллера отображается кнопка назад, но предыдущий контроллер представления , чтобы быть вернулось.

Если вам не нужен текст заголовка для предыдущего контроллера представления, просто заполните заголовок пустой строкой;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

Это предотвратит отображение «назад» с помощью шеврона на контроллере просмотра.

РЕДАКТИРОВАТЬ: Даже если вы используете непустой текст заголовка, установка заголовка предыдущего контроллера вида в viewWillAppear:работах, за исключением того, что заголовок может мигать, когда контроллер представления выскочил. Я думаю, что «приложение Twitter», кажется, делает более тонкий взлом, чтобы избежать мерцания.


Единственная проблема, с которой я столкнулся, заключалась в том, что когда я нажимал на панель навигации, чтобы вернуться, заголовок предыдущего представления становится пустым. Любой способ обойти это?
Alioo

@ Алио Вы пробовали то, что я упомянул в строке "РЕДАКТИРОВАТЬ"?
Хироши

20

Это работает, но удалит заголовок предыдущего элемента, даже если вы вернетесь к нему:

self.navigationController.navigationBar.topItem.title = @"";

Просто установите это свойство на viewDidLoadнажатой View Controller.


17
Это удалит заголовок предыдущего элемента, даже если вы вернетесь к нему. Не очень хорошо :(
Antzi

Я установил заголовок нажимающего ВК, viewWillAppearчтобы он всегда был установлен правильно.
Гуто Араужо

@GutoAraujo Это работает, но название появляется снова с задержкой в ​​1 или 2 секунды, что делает UX не очень хорошим.
fuiiii

В xCode8 -> ios10.X кажется, что это единственный способ решить проблему
LucioB

12

Это то, как я это делаю, и самый простой, эффективный и понятный способ сделать это.

Это работает, если встроить Navigation Controller

Свифт 3

В viewDidLoadдобавлении этого в View Controller вы хотите, чтобы кнопка «Назад» была просто стрелкой.

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

Отличие этого от ответа @Kyle Begeman состоит в том, что вы вызываете это на контроллере представления, который вы хотите, чтобы кнопка «назад» была просто стрелкой, а не на контроллере представления с выталкивающим стеком.


7

У вас нет доступа к навигации backButtonItem так, как вы хотите, вам нужно создать собственную кнопку возврата, как показано ниже:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

И конечно

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

затем мы потеряли приятную анимацию затухания, которая произошла на кнопке «Назад»
Kiddo

3
Вам нужна маска для плавных переходов. «* Если вы хотите использовать настраиваемое изображение для замены шеврона по умолчанию, вам также необходимо создать настраиваемое изображение маски. IOS 7 использует маску для того, чтобы заголовок предыдущего экрана появлялся или исчезал из шеврона во время навигации переходы «.
Пользователь

3
@null, вы потеряете жест смахивания из стороны в сторону в iOS 7!
Мазен Кассер

@user Я получаю пользовательское изображение, но цвет оттенка по умолчанию синий. Как я могу получить без добавления оттенка? спасибо
Мазен Кассер

7

Цель: настройка кнопки «Назад» наUINavigationBarбелый значок

Шаги: 1. в методе "didFinishLaunchingWithOptions" AppDelete :

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2. в viewDidLoadметоде общего суперкласса ViewController:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

Это показывает предупреждение "Неявная версия SYSTEM_VESION _..." недопустима в C99.
Джайпракаш Дубей

7

SWIFT 4

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

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Для более универсального использования сделайте следующее:

  1. Создайте универсальную функцию следующим образом:

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. Затем используйте его в контроллерах представления следующим образом:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

Простой взлом от iOS6 тоже работает на iOS7:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

Изменить: не используйте этот хак. Смотрите комментарий для деталей.


6
Не используйте этот хак. В коде Apple на 64-разрядных устройствах имеется ошибка, которая не позволяет модальным представлениям появляться при изменении смещения заголовка кнопки панели. Подробнее .
Ж

Ну, были только проблемы на устройстве, а не на симуляторе.
Ж

Этот хак больше не работает при сборке с Xcode 9 / iOS 11. «<» будет казаться слишком низким, и вы увидите нарушенные ограничения при запуске в отладчике.
Т`Пол

3

Вы можете использовать это. Это прекрасно работает для меня, просто добавив UIButtoncustumview для UIBarButtonItem.

Попробуйте код ниже

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}

3
однако, это отключит жест смахивания назад в iOS 7
user102008

3

Создайте UILabelс названием, которое вы хотите для вашего корневого контроллера представления и назначьте его контроллеру представления navigationItem.titleView.

Теперь установите заголовок на пустую строку, и у следующего контроллера представления, который вы нажмете, будет кнопка возврата без текста.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}

3

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

Вот метод, использующий метод Swizzling, просто создайте новое расширение для UINavigationItem

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}

Установите кнопку назад на слово назад, отлично работает: self.navigationItem.backBarButtonItem.title = @ "Back";
Майк Зриэль

Что ты имеешь в виду, приятель? Вопрос был об удалении текста с кнопки назад?
Якуб Волански

1
Многие приложения и собственные приложения Apple говорят «<назад», поэтому хорошо придерживаться стандарта. BigTakeAway и JustEat.
Майк Зриэль

2

Я применил следующий код в viewDidLoad, и он работает:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

Просто для обновления я использую Векторный Icon


2

Вы можете создать подкласс UINavigationController, установить себя в качестве делегата и установить backBarButtonItem в методе делегата navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

2

Установить обратно название пустым

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

Изменить изображение назад

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

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

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

В некоторых случаях элемент навигации может уже существовать, в других случаях его необходимо создать. Это учитывает оба этих случая, не мешая названию элемента навигации. Это позволяет вам удалить заголовок, просто передав @"".


1
Это правильный ответ. Никаких хитростей. Это просто использование iOS API, как это было задумано, чтобы установить заголовок. Установите значение @, чтобы удалить заголовок (проверено и работает нормально).
13

1

Единственный способ, который работал для меня, был:

navigationController?.navigationBar.backItem?.title = ""

ОБНОВИТЬ:

Когда я изменил флаг анимации segue на true (раньше он был false), единственный способ, который работал для меня, был:

navigationController?.navigationBar.topItem?.title = ""

1

Если у вас есть два ViewController (FirstVC, SecondVC) Embed в Navigation Controller, и вы хотите, чтобы во SecondVC была только стрелка назад.

Вы можете попробовать это в FirstVC ViewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

Затем, когда вы нажмете на SecondVC, вы увидите, что есть только стрелка назад


1

Если вы установите tintColor Of NavigationBar, добавьте пользовательское изображение кнопки «Назад» без заголовка, чтобы цвет оттенка отражал цвет изображения. Пожалуйста, перейдите по этой ссылке для документирования яблок.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];


1

Я написал расширение, чтобы сделать это проще:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}

1

Вы можете изменить заголовок на @ "" текущего ViewController на viewWillDisappear, и когда он снова появится, снова установите заголовок на то, что было раньше.

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

В методе prepareForSegue: вашего первого ViewController вы устанавливаете заголовок этих представлений на @ "", поэтому при нажатии следующего представления будет отображаться предыдущий заголовок ViewController, который будет @ "".

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

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

-(void)viewWillAppear:(BOOL)animated{
   self.navigationItem.title = @"First View Title";
}

Мне не очень нравится это решение, но оно работает, и я не нашел другого способа сделать это.


Смотрите мой ответ для правильного решения без возражений с заголовком элемента навигации.
Дима

Сохраняет ли ваше решение iOS7 стрелку назад? Я пробовал что-то подобное, но оно убрало стрелку.
Алехандро Фигероа

В iOS 7 он держит стрелку назад, да. В iOS 6 передача пустой строки (0 длины) также полностью удалит кнопку, так что это действительно полезно только для iOS 7.
Дима

Есть очень простое решение. Посмотрите, работает ли мой ответ для вас.
Гуто Араужо

0

Чтобы добавить ответ Томаса С. выше, иногда ставить один пробел не получается, и вы должны продолжать добавлять пробелы.

кнопка пустой панели

Вы узнаете, что добились успеха, когда увидите «Элемент панели кнопок» под «Элементом навигации». Это в схеме документа (редактор-> Показать схему документа). Как только вы увидите изображение выше, вы можете удалить несколько пробелов и посмотреть, работает ли оно по-прежнему.


0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

Как и Кайл Бегеман, вы добавляете приведенный выше код в свой контроллер корневого представления. Все подчиненные контроллеры будут применены. Кроме того, добавив это в initWithCoder: метод, вы можете применить стиль для корневых контроллеров представления в xib, раскадровке или основанном на коде подходах.

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