Удаление текста заголовка iOS UIBarButtonItem

198

Я хотел удалить текст с кнопки «Назад» на a UIBarButtonItem, оставив только синий шеврон на панели навигации. Имейте в виду, что я разрабатываю для iOS 7. Я попробовал несколько методов, включая, но не ограничиваясь:

Это метод изображения, который мне не понравился (изображение выглядело неуместно):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

Другой метод, который я попробовал, был такой, который просто не работал (ничего не отображалось):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

Я хотел добиться чего-то вроде кнопок «назад», найденных в приложении iOS 7 Music, в котором был только один шеврон.

Спасибо.

Пан Зиюэ
источник
посмотрите на этот ответ stackoverflow.com/a/20300577/1589731
ayalcinkaya
Почему бы вам не сфотографировать то, что ваше требование? И отослать это в leftBarButtonItem.
Вишал Шарма
Причина, по которой я не использовал метод изображения, заключается в том, что 1. Очень трудно получить идеальное изображение кнопки «Назад» и 2. Будет некоторое смещение изображения, и оно не выглядит естественным, и именно поэтому Я обратился в StackOverflow за помощью в том, как это сделать изначально.
Пан Зиюэ

Ответы:

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

Затем вы можете удалить заголовок кнопки «Назад».

Если вы используете раскадровку, вы можете установить инспектор атрибутов навигации Back Button с пробелом.

andyleehao
источник
95
Существует проблема с большими заголовками: они не центрированы, а сдвинуты вправо, как если бы текст кнопки «Назад» был все еще там
sonxurxo
11
Это не работает, если пользователь включил «Специальные возможности - формы кнопок»
Микаэль Бартлетт
22
Я думаю, что это лучший ответ:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
Бенджамин
19
Любое решение с магическими числами - плохая идея. С толчком к автоматической разметке, классам размеров, функциям специальных возможностей и т. Д. Использование постоянных значений, подобных этому, неизбежно укусит вас.
Майкл Петерсон
3
Чтобы улучшить комментарий UIControlStateHighlighted
Бенджамина
411

Чтобы установить заголовок кнопки «Назад» для контроллера представления без изменения его заголовка, используйте:

Objective-C:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];

Swift:

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

Чтобы было ясно, это делается на контроллере вида, который вы увидите, если нажмете кнопку возврата. т. е. вместо того, чтобы видеть «<Настройки», вы хотите просто увидеть «<», тогда на вашем контроллере SettingsView вы поместите это в свой init. Тогда вы не получите никаких проблем с заголовком, который не отображается, когда вы смотрите на сам контроллер представления.

DonnaLea
источник
1
Я не знаю, почему другой ответ помечен как правильный, он просто удаляет заголовок, поэтому у кнопки «Назад» есть «заголовок», который нужно показать, но это совсем не правильный подход! Этот должен быть правильный ответ.
Пах
8
Также для всех, кто использует Swift, это navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .Plain, target: nil, action: nil). Не трудно перейти из Obj-C в Swift, но я избавлю вас от хлопот
Зойт
15
@BenjaminPiette вы вызываете это на контроллере UIViewController, который вы бы увидели, если бы вы нажали кнопку назад? Не UIViewController, который отображает кнопку назад.
DonnaLea
2
Какое элегантное решение! Спасибо. Просто было не правильно делать смещение.
Hyd00
2
Это решение прекрасно работает, если вы напишите эту строку кода на предыдущем контроллере в стеке навигации.
Богдан
128

Если вы используете раскадровки, вы можете перейти к Attributes InspectorViewController'у Navigation Item(щелкнуть Navigation Bar) и установить для Back Buttonсвойства значение "" (один пробел). Это установит заголовок кнопки «Назад» на один пробел, оставляя шеврон видимым. Не нужно связываться с кодом.

пример изображения

Обратите внимание, что это установит Back Buttonзаголовок для кнопки «Назад», которая будет переходить к этому контроллеру вида из той, которая была нажата поверх него, а не для того, Back Buttonчто будет отображаться внутри этого контроллера!

Никита Кукушкин
источник
10
Хотелось бы, чтобы я высказался так: «Обратите внимание, что это установит заголовок кнопки« Назад »для кнопки« Назад », которая будет переходить к этому контроллеру вида из той, которая была нажата поверх него, а не для кнопки« Назад », которая будет отображаться внутри этой кнопки. контроллер!»
Джейсон Лейн,
121

Это работает для меня, чтобы отобразить только «задний» шеврон без какого-либо текста:

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

Установите это свойство в viewDidLoad View Controller, представляющем панель навигации, и это сделает свое дело.

Примечание: я тестировал его только в iOS 7, что входит в сферу вопроса.

Гуто Араужо
источник
33
Это побочный эффект удаления метки заголовка в середине панели навигации.
Pwner
7
Установите заголовок толкающего VC на «viewWillAppear» с тем же свойством. Таким образом, это не удаляется.
Гуто Араужо
5
Я переместил этот фрагмент кода -viewDidLoadв VC, который мне не нужен текст Back. Однако позже я узнал, что когда я вставляю второй VC из navigationControllerтекста заголовка, он появляется вскоре после, а не сразу. Я думаю, что видео могло бы проиллюстрировать это лучше, поэтому вот оно: ссылка
Pan Ziyue
1
Это не лучший ответ, пожалуйста, обратитесь к ответу andyleehao: [[UIBarButtonItem появление] setBackButtonTitlePositionAdjustment: UIOffsetMake (0, -60) forBarMetrics: UIBarMetricsDefault];
После
1
Это правильный ответ в соответствии с документацией Apple: «Когда получатель находится в стеке элементов навигации и находится на втором месте сверху - другими словами, его контроллер представления управляет представлениями, к которым пользователь будет переходить назад, - значением в этом свойстве используется для кнопки «Назад» на самой верхней панели навигации. Если значение этого свойства равно nil, система использует строку «Назад» в качестве текста кнопки «Назад». "
Рафаэль Оливейра
27

Когда вы устанавливаете заголовок кнопки, используйте @ "" вместо @ "".

--РЕДАКТИРОВАТЬ--

Что-нибудь меняется, когда вы пробуете другие строки? Я успешно использую следующий код:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString - это переменная, для которой задано значение @ "" или @ "Back", в зависимости от того, работаю ли я на iOS 7 или ниже.

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

Камароса
источник
Хм, iOS 7, похоже, не меняет это. Он продолжает использовать «Назад» в качестве заголовка. Если бы я поставил setLeftBarButtonItem:backButtonвместо этого ничего не было бы там.
Пан Зиюе
1
Если это так, и ничего не происходит, когда вы устанавливаете заголовок на что-то другое, я думаю, вам придется попробовать перенести код в родительский контроллер представления. Я использую код, который я разместил выше в моем методе prepareForSegue.
Камарос
27

введите описание изображения здесь

Иногда полезно видеть вещи в контексте. Вот минимальный проект, который скрывает текст «назад», но показывает стрелку.

Раскадровка

введите описание изображения здесь

От кнопки «Показать контроллер второго вида» происходит переход к второму контроллеру представления.

Я также добавил элемент навигации ко второму контроллеру представления, чтобы он имел заголовок. Это необязательно. Это не влияет на кнопку назад.

Код

FirstViewController.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

Альтернативный метод (только IB, без кода)

На раскадровке выберите элемент навигации для первого контроллера представления (а не второго). Просто введите пробел для текста кнопки «Назад».

введите описание изображения здесь

Suragch
источник
Ключевая концепция, которая «для первого контроллера представления (не второго)», как и название VC, к которому вы хотите вернуться, является обязанностью дать этот заголовок.
Buguibu
15
self.navigationController.navigationBar.topItem.title = @"";
Клаудио Кастро
источник
1
Вы можете использовать backItem вместо topItem. TopItem скрывает заголовок, а backItem скрывает заголовок кнопки «Назад».
Рави Ойха
2
Это единственное решение, если childViewController находится на глубине 2+ в дочернем стеке NavigationController
Nathaniel Blumer
2
Это также удалит заголовок предыдущего контроллера представления. В большинстве случаев это будет отстой
CalZone
11

На iOS7 Apple представила два новых свойства для UINavigationBar: «backIndicatorTransitionMaskImage» и «backIndicatorImage».

Просто позвонив один раз:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

Он будет отображать пользовательское изображение вместо символа шеврона по умолчанию, наследуя цвет оттенка keyWindow.

А для удаления названия я предложу ответ Камароса. Не забудьте вызвать этот код на контроллере представления, который выдвигает ваш новый контроллер представления. Удаление текста заголовка iOS UIBarButtonItem

DZenBot
источник
Чтобы настроить цвет оттенка [[UINavigationBar Внешний вид] setTintColor: [UIColor whiteColor]];
Мазен Кассер
10

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

Grahambo
источник
10

Это работало для меня в iOS10. Вызовите это из viewDidLoad контроллера представления.

self.navigationController?.navigationBar.topItem?.title = ""
Ravi
источник
6

Простое решение этой проблемы, работающее как на iOS7, так и на 6, заключается в установке пользовательского представления заголовка в viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

Тогда в viewWillAppear: вы можете смело звонить

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

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

Маттес
источник
Мне нужна была только последняя часть кода, а не пустой UILabel. Я звонил [self.navigationItem.backBarButtonItem setTitle:@" "];в viewWillAppear, но он не работал с представлениями, представленными после отклонения модального представления.
Дизиет
6

На самом деле вы можете сделать это с помощью одного трюка:

Переопределите UINavigationBarкласс и добавьте следующую строку кода:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

Затем инициализируйте ваш UINavigationControllerс этим пользовательским классом UINavigationBar .. и т. Д.UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

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

rordulu
источник
Это сработало для меня. Хотя кажется, что в iOS 7 есть небольшая задержка в анимации push: название, кажется, освобождает место для кнопки «Назад», а затем центрируется, поскольку ее нет.
Zekel
Да, попробуйте использовать пользовательский titleView вместо прямой установки navigationItem.title. Я думаю, что это должно решить вашу проблему.
rordulu
Это решение прекрасно, потому что оно глобально для каждой панели навигации, которая имеет подкласс. Спасибо
Йетиспапа
5

Я смог собрать что-то вместе, используя ответ DonnaLea. Вот как выглядит решение в моем подклассе UIViewController:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

Проблема с оригинальным ответом состоит в том, что он удаляет заголовок из контроллера, когда вы возвращаетесь к нему. Попытка сбросить заголовок в viewWillDisappear слишком поздно в процессе перехода; Это приводит к тому, что заголовок возвращается, вместо того, чтобы красиво анимироваться. Однако willMoveToParentViewController происходит раньше и учитывает правильное поведение.

Предостережение: я проверил это только с помощью обычного UINavigationController push / pop. Там может быть дополнительное неожиданное поведение в других ситуациях.

BradB
источник
4

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

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

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

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

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

Алехандро Фигероа
источник
4

SWIFT 3

navigationController?.navigationBar.topItem?.title = ""
Иржи Захалка
источник
3

Ни один из ответов не помог мне. Но трюк сработал - я просто очистил заголовок контроллера представления, который нажимал (куда собирается кнопка «назад») непосредственно перед нажатием.

Поэтому, когда предыдущий вид не имеет заголовка, в iOS 7 кнопка «Назад» будет иметь только стрелку, без текста.

На viewWillAppearтолкающем экране я вернул исходное название.

Коф
источник
1
Хм, этот трюк работает. Однако, похоже, что слова там иногда будут мерцать. Не очень хороший обходной путь, но, тем не менее, хороший. +1
Пан Зиюэ
3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

У меня была такая же проблема, и я сделал это таким образом.

--РЕДАКТИРОВАТЬ--

Это решение, когда вы действительно хотите удалить текст заголовка всех UIBarbuttonItem. Если вы хотите удалить только заголовок элемента кнопки задней панели, не существует простого простого удобного решения. В моем случае, поскольку у меня есть только несколько UIBarButtonItems, которые должны показывать текст заголовка, я просто изменил эти заголовки этих кнопок titleTextAttributes. Если вы хотите быть более конкретным, используйте код ниже, который изменит только кнопки панели навигации:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];
andylee
источник
1
Это работает для меня, однако вы можете кратко увидеть текст при ответном ударе.
Дизиет
3
@Diziet попробуйте добавить то же самое для государства , UIControlStateHighlightedа также
CoderPug
2
Это прекрасно работает, но это также «скрывает» все другие кнопки, не только кнопку «Назад» ... Есть идеи, чтобы решить эту проблему?
Urkman
3

Это с помощью подкласса navigationControllerудаляет «Назад».

Я использую это, чтобы удалить его навсегда через приложение.

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                                       style:UIBarButtonItemStylePlain
                                                                                      target:nil
                                                                                      action:nil];
}

@end
0yeoj
источник
3
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];
Билл Се
источник
1
Пожалуйста, добавьте объяснение к вашему ответу.
Алекс
1 сделайте тот же цвет, что и панель навигации 2 сделайте размер текста достаточно маленьким, чтобы не сжать заголовок
Билл Се
Я рассмотрел ваш ответ, вы всегда должны поддержать свой ответ.
Алекс
2

Скрыть кнопку «Назад», заголовок панели навигации

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
Кирит Вагела
источник
2

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

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}
YannSteph
источник
2

Swift 3.1 Вы можете сделать это, реализовав метод делегата UINavigationController. Он будет скрывать только заголовок с кнопкой «назад», мы все равно получим изображение стрелки назад и функциональность по умолчанию.

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }
SMMoinuddin. Shuvo
источник
1

Вы также можете использовать это:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

Это работает для меня

Уткарш 786
источник
1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }
AG
источник
1

Идеальное решение во всем мире

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}
PeiweiChen
источник
дампест решение всех ... его также использовать пространство, как раньше ... его просто стало прозрачным ...
Ласло
Он удаляет текст из всех UIBarButtonItems приложения
Mikel Sanchez
1

Я создаю собственный класс UINavigationControllerи применяю его ко всем контроллерам навигации в моем приложении. Внутри этого пользовательского UINavigationControllerкласса я установил UINavigationBarделегат, как selfтолько загрузится представление.

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

Затем я реализую метод делегата:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

Таким образом, я просто назначаю свой пользовательский класс всем моим контроллерам навигации, и он очищает заголовок от всех кнопок возврата. И просто для ясности, я всегда устанавливаю заголовок для всех остальных моих контроллеров представления viewWillAppearтак, чтобы заголовок всегда обновлялся непосредственно перед появлением представления (в случае, если оно удаляется подобными приемами).

nurider
источник
1

Просто введите один пробел для кнопки навигации «Назад»!

VirajP
источник
1
Это больше подходит в качестве комментария, чем ответа.
Аль Лелопат
1

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

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

Кажется, что если он не будет представлен, то независимо от того, что он будет пытаться показать заголовок, это означает, что он будет показан, затем скрыт перед тем, как нарисован, и решит проблему.

Николас Смит
источник
1
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}
Maor
источник
1

Я сделал очень простую категорию с нулевым конфигом, чтобы скрыть все заголовки кнопок «Назад» через приложение, которое вы можете проверить здесь . На этот вопрос уже принят ответ, но для других это может быть полезно.

РЕДАКТИРОВАТЬ:

.h файл

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

.m файл

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
Пратик Джамария
источник