Спеціальна кнопка повернення 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 відповідь + навігаційну смугу tintColor властивість, щоб зробити шеврон із спеціальним кольором та без будь-яких назв
Дмитро Жуков

Для тих, у кого є панель вкладок, і вам не потрібен текст кнопки повернення, виправлення полягає в: у viewDidLoad () TabBarController поставлено: self.navigationItem.backBarButtonItem = UIBarButtonItem (назва: "", стиль:. рівнина, ціль: нуль, дія: нуль)
Борж

Відповіді:


313

Насправді це дуже просто, ось що я роблю:

Мета C

// 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];

Швидкий 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
Я відчуваю, що для цього потрібне оновлення, воно просто нічого не показує зараз, стрілка за замовчуванням не існує?
Mathijs Segers

198

Я знайшов простий спосіб зробити кнопку "назад" за допомогою iOS-однієї стрілки.

Будемо вважати, що у вас є навігаційний контролер, який переходить до ViewA з ViewB. У IB виберіть панель навігації ViewA, ви повинні побачити такі параметри: Назва, Підказка та Кнопка Назад.

Параметри навігаційної панелі ViewA

Параметри навігаційної панелі ViewA

Трюк полягає у виборі заголовка кнопки повернення контролера долі (ViewB) у параметрах попереднього контролера перегляду (Перегляд A). Якщо ви не заповнили опцію "Кнопка назад", iOS автоматично поставить заголовок "Назад" із попереднім заголовком контролера перегляду. Отже, вам потрібно заповнити цей параметр єдиним пробілом.

Заповніть простір у варіанті «Кнопка назад»

Заповніть простір у варіанті «Кнопка назад»

Результат:

Результат:


Ласкаво просимо до переповнення стека . Якщо ви ще цього не зробили, подивіться, що ми їздимо на тур , і прочитайте деякі статті в довідковому центрі про те, як ми працюємо та деякі звичаї громади. Якщо вам потрібна допомога з функціями сайту, не бійтеся шукати, а тоді задайте питання щодо переповнення Meta Stack (якщо ви все ще не змогли знайти відповідь). Дякую, і удачі! У будь-якому випадку ви можете розмістити свої зображення зараз ... :)
Qantas 94 Важкий

53
це працює, просто зверніть увагу - вам потрібно встановити "Кнопку назад" для попереднього контролера (наприклад, для rootViewController у вашому контролері навігації)
evfemist

Переконайтесь, що для елемента навігації в ViewA для параметра "hidesBackButton" встановлено значення TRUE
shim

Мені здається, що це працює, якщо назва представленого контролера досить довгий - якщо це короткий заголовок, він буде використаний замість цього.
амергін

1
для мене це працює лише тоді, коли і вихідний, і цільовий пункт ViewController's 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@2x.png

Ікона-назад @ 2х

Icon-Back@3x.png

Ікона-назад @ 23x


4
За допомогою цього рішення ви, здається, втрачаєте функцію "проведіть пальцем назад".
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfробить фокус, щоб
стрибнути

Я шукав цю відповідь, можливо, все життя, а саме селектор дій.
Дес

29

iOS7 має нові правила інтерфейсу, тому під час натискання UIView краще тримати принаймні стрілку назад. Дуже легко змінити "задній" текст програмно. Просто додайте цей код перед тим, як натиснути подання (Або підготуйтеForSegue, якщо ви використовуєте 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]; ( джерело ) - може бути трохи менш елегантним, але шиплячий відчув себе як
надмір

2
Серйозно ви всі ... не передавайте будь-яке інше рішення. Реалізуйте рішення @nicky, розміщене як категорію, і не думайте двічі. Це відмінне рішення для багаторазового використання, яке можна реалізувати в додатку широко, якщо додати цей файл Prefix.pch. Apple рекомендує використовувати категорії для додавання методів до існуючих класів, ви повинні скористатися цим, коли це можливо.
zmonteca

На моє переконання, це найкраще рішення, так чи інакше "method_exchangeImplementation" є трохи небезпечним, погляньте на це: Правильний шлях до шипіння і цей посібник із шипучого руху NSHipster
Алессандро Орр

@ AlessandroOrrù У цьому конкретному випадку це повинно бути безпечним, оскільки закручений метод - це UINavigationItemвласний метод, не має ніякої спадщини. І _cmdнавряд чи буде залучено до геттера. У всякому разі, це хороший момент. Отже, якщо у вас є будь-який із цих численних запаморочливих помічників у вашому проекті, переконайтесь, що ви його також використовуєте тут.
secondcitysaint

21

EDIT: 2014-04-09: Коли я здобув репутацію, мені шкода, тому що я вже не використовую цей трюк. Я рекомендую відповідь Кайла. Також зверніть увагу , що selfз self.navigationItem.backBarButtonItemНЕ - контролера відображається кнопка назад, але попередній контролер уявлення , щоб бути повернулося.

Якщо вам не потрібно мати текст заголовка для попереднього контролера перегляду, просто заповніть заголовок порожнім рядком;

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

Це запобіжить показ "назад" з шевроном на натиснутому контролері подання.

РЕДАКТУВАННЯ. Навіть якщо ви використовуєте непорожній текст заголовка, встановлення заголовка попереднього контролера перегляду в viewWillAppear:роботах, за винятком того, що заголовок може мерехтіти, коли контролер перегляду спливе. Я думаю, що "додаток щебетати", здається, робить більш тонкий злом, щоб уникнути мерехтіння.


Єдиною проблемою у мене було те, що коли я натискаю на панель навігації, щоб повернутися назад, заголовок попереднього виду стає порожнім. Як-небудь навколо цього?
Аліоо

@Alioo Ви спробували те, що я згадував у рядку "РЕДАКТУВАННЯ"?
hiroshi

20

Це працює, але він видалить заголовок попереднього елемента, навіть якщо ви повернетесь до нього:

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

Просто ввімкніть цю властивість viewDidLoadнатиснутого контролера View.


17
Це видалить заголовок попереднього елемента, навіть якщо ви повернетесь до нього. Не дуже добре :(
Antzi

Я встановлюю заголовок натискання VC, viewWillAppearщоб він завжди був встановлений правильно.
Guto Araujo

@GutoAraujo Це працює, але заголовок повторно з’являється з відстрочкою на 1 або 2 секунди, що робить UX не таким хорошим.
fuiiii

У xCode8 -> ios10.X це, мабуть, єдиний спосіб вирішити цю проблему
LucioB

12

Так я це роблю і найпростіший, найпростіший і найясніший спосіб зробити це.

Це працює, якщо вбудувати Navigation Controller

Швидкий 3

Якщо viewDidLoadя додаю це до контролера перегляду, ви хочете, щоб кнопка "назад" була лише стрілкою.

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

Відмінність цього від відповіді @Kyle Begeman полягає в тому, що ви називаєте це на контролері перегляду тим, що ви хочете, щоб кнопка "назад" була просто стрілкою, а не на натисканні контролера подання стека.


7

Ви не маєте доступу до навігаційного спискуButtonItem так, як вам потрібно, вам потрібно створити власну кнопку назад, як показано нижче:

- (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. Значок "<" виявиться занадто низьким, і ви побачите порушені обмеження під час запуску у відладчику.
T'Pol

3

ви можете використовувати це. Це прекрасно працює для мене, просто додавши UIButtonдо нього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 = @ "Назад";
Майк Зріел

Що ти маєш на увазі товариш? Питання стосувалося видалення тексту із кнопки "Назад"?
Якуб Воланський

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"]]];

Просто для оновлення я використовую Vector 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
Це правильна відповідь. Ніяких хитрощів. Це просто використання API iOS так, як це було призначено для встановлення заголовка. Установіть його на "" ", щоб видалити заголовок (перевірено і працює добре).
n13

1

Єдиний спосіб, який працював на мене:

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

ОНОВЛЕННЯ:

Коли я змінив прапор мультиплікаційної анімації на справжній (раніше це було помилково), єдиний спосіб, який працював на мене, полягав у тому, що:

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

1

Якщо у вас є два ViewController (FirstVC, SecondVC), що вбудовуються в навігаційний контролер, і ви хочете, щоб у SecondVC була лише стрілка назад.

Ви можете спробувати це в ViewDidLoad FirstVC

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

У методі PrepaForSegue: у своєму першому 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.
Діма

Є дуже просте рішення. Подивіться, чи працює моя відповідь для вас.
Guto Araujo

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.