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


210

Как настроить навигационную кнопку в iOS 7 и выше без заголовка? (То есть только стрелки)

self.navigationItem.leftBarButtonItem = self.editButtonItem; 

Я просто интересно, если у них есть какие-либо self.backButtonItem;

OR

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

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

Вы можете использовать @hiroshi ответ + панель навигации tintColor свойство сделать шеврон с пользовательским цветом и без каких-либо названий 26 сен. 132013-09-26 09:55:24

  0

Для тех, у кого есть панель вкладок , и вам не нужен текст кнопки «Назад», исправление: в ** viewDidLoad() ** вкладчика TabBarController: _self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .plain, target : nil, action: nil) _ 01 июл. 172017-07-01 01:10:08

6

У вас нет доступа к навигации 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]; 
} 
  0

, тогда мы потеряли прекрасную анимацию погашения, произошедшую на обратной кнопке 18 сен. 132013-09-18 11:12:14

+3

Вам нужна маска для плавных переходов. «* Если вы хотите использовать пользовательский образ для замены стандартного шеврона, вам также нужно создать изображение пользовательской маски. IOS 7 использует маску, чтобы заставить заголовок предыдущего экрана появляться или исчезать из-шеврона во время навигации переходы «. 22 сен. 132013-09-22 03:25:15

+2

@null вы потеряете бок о бок с жестом iOS 7! 31 окт. 132013-10-31 01:50:52

  0

@user Я получаю пользовательское изображение, но цвет оттенка по умолчанию синий. Как я могу добавить оттенок? спасибо 31 окт. 132013-10-31 04:08:51

  0

его рабочий шарм! спасибо Mr.null !! 27 июл. 152015-07-27 08:05:09


21

EDIT: 2014-04-09: Поскольку я получил репутацию, мне жаль, потому что я больше не использую этот трюк. Я рекомендую ответить Кайлу. Также обратите внимание, что selfself.navigationItem.backBarButtonItem не является контроллером представления, а кнопка назад отображается, но предыдущий контроллер просмотра должен быть возвращен.

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

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

Это предотвратит показ «назад» с шевром на контроллере с нажатой точкой.

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

  0

Единственная проблема, с которой я столкнулся, заключалась в том, что когда я нажимаю навигационную панель, чтобы вернуться назад, заголовок на предыдущем представлении становится пустым. В любом случае? 10 окт. 132013-10-10 02:43:27

  0

@Alioo Вы попробовали то, что я упомянул в строке «EDIT»? 10 окт. 132013-10-10 12:09:27


297

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

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

Swift 2

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

Swift 3

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

Поместите эту строку в контроллер вида, который нажимает на стек. Вновь нажатая кнопка возврата контроллера отобразит все, что вы положили для initWithTitle, который в этом случае является пустой строкой.

+3

Я использовал это, но название приходит и исчезает в анимированной манере ?? 02 ноя. 132013-11-02 04:21:05

+7

Спасибо, Кайл! Я искал способ переименовать кнопку возврата по умолчанию в iOS 7. Я поместил это в свой 'prepareForSegue' в контроллер представления, и он работал отлично. 06 янв. 142014-01-06 15:32:14

+1

@ user1010819 Это ожидаемое поведение, barButtonItems будет оживлять и отключать при переключении контроллеров. Что вы пытаетесь достичь? 07 янв. 142014-01-07 01:48:04

+1

@YiweiGao Нет проблем!Это просто еще одна из тех вещей, что, если вы знаете правильный код, это довольно просто! Я рад, что это помогло! 07 янв. 142014-01-07 01:48:50

  0

@KyleBegeman ya Я понял это. Спасибо. 07 янв. 142014-01-07 08:33:03

  0

Я добавил [небольшое наблюдение] (http://stackoverflow.com/a/22584725/971055) о том, как избежать копирования в этом коде везде :) 22 мар. 142014-03-22 23:02:37

  0

Отличный ответ! Почему, черт возьми, он похоронен внизу страницы? 04 апр. 142014-04-04 18:01:18

  0

Спасибо! Не знаете, почему это еще не ответ? +1 для быстрого примера :) 22 ноя. 142014-11-22 00:46:09

  0

Это сработало отлично. 09 дек. 142014-12-09 10:30:05

+2

Мне кажется, что это требует обновления, оно просто ничего не показывает прямо сейчас, стрелки нет по умолчанию? 28 мар. 152015-03-28 10:23:51

  0

Есть ли способ изменить изображение, кроме текста? 02 май. 152015-05-02 13:12:07

  0

Я в шоке, это сработало. И он держит стрелку, и все еще выскакивает стек. Это также позволяет вам установить другое название; в моем случае мне нужно было «НАЗАД» по всему миру. 29 ноя. 162016-11-29 18:17:35

  0

, а также стоит добавить, что я установил это в виде viewwillappear суперконтроллера, который я использую для всех остальных. 29 ноя. 162016-11-29 18:18:35


6

Простой хак от iOS6 работает на iOS7 тоже:

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

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

+6

Не используйте этот хак. В коде Apple на 64-разрядных устройствах есть ошибка, которая предотвратит появление модальных представлений при создании смещения заголовка панели. [Подробнее] (http://stackoverflow.com/a/19119388/674741). 23 окт. 132013-10-23 08:57:15

  0

Ну были только проблемы на устройстве, а не на симуляторе. 12 фев. 162016-02-12 04:54:41

  0

Этот хак больше не работает при построении с Xcode 9/iOS 11. «<» будет казаться слишком низким, и вы увидите сломанные ограничения при запуске в отладчике. 01 окт. 172017-10-01 22:14:06


28

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

-(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

Это работает очень хорошо и кажется лучше других. Например, название никогда не должно быть сброшено до предыдущего значения, в отличие от некоторых других ответов. 20 ноя. 132013-11-20 14:56:04


-1

Это работает лакомство как для iOS6 и 7

Xamarin (C#) Варианты

var buttonStyleItems = UIBarButtonItem.AppearanceWhenContainedIn(typeof(SettingsNavigationController)); 
buttonStyleItems.SetBackButtonTitlePositionAdjustment(new UIOffset(-1000, -1000), UIBarMetrics.Default); 

вариант Objective-C

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

  0

Это, к сожалению, вызывает проблемы с 64-разрядной совместимостью, если ваше приложение поддерживает 32-разрядные устройства. Это ошибка Apple, но нет обходного пути, и это не жизнеспособное решение. См. Мой ответ для рабочего подхода. 06 ноя. 132013-11-06 20:32:31

  0

В ответе говорится, что это работы iOS6 и 7? Поддержка будущих выпусков не может быть гарантией. 13 окт. 172017-10-13 19:49:24


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

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

  0

См. Мой ответ для правильного решения, не входя в заголовок пункта навигации. 06 ноя. 132013-11-06 20:30:49

  0

Поддерживает ли ваше решение обратную стрелку iOS7? Я попробовал что-то подобное, но удалил стрелку. 07 ноя. 132013-11-07 17:10:18

  0

Сохраняет обратную стрелку в iOS 7, да. В iOS 6, проходящем в пустой строке (0 length), также будет полностью удалена кнопка, так что это делает это очень полезно для iOS 7. 08 ноя. 132013-11-08 04:27:47

  0

Существует очень простое решение. Посмотрите, работает ли мой ответ на вас. 09 ноя. 132013-11-09 00:07:14


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 так, как он должен был использоваться, чтобы установить заголовок. Установите его на @ "", чтобы удалить заголовок (проверено и работает отлично). 11 фев. 152015-02-11 08:35:50


20

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

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

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

+17

Это удалит заголовок предыдущего элемента, даже если вы вернетесь к нему. Не очень хорошо :( 27 ноя. 132013-11-27 10:12:07

  0

Я установил название нажатия VC на 'viewWillAppear', поэтому он всегда устанавливается правильно. 27 ноя. 132013-11-27 11:47:10

  0

@GutoAraujo Это работает, но заголовок снова появляется с задержкой на 1 или 2 секунды, что делает UX не очень хорошим. 19 июл. 142014-07-19 23:15:36

  0

В xCode8 -> ios10.X это, по-видимому, единственный способ решить проблему 08 фев. 172017-02-08 10:52:11


3

вы можете использовать это. Это отлично работает для меня, просто добавив UIButton в качестве custumview для 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; 
} 
+1

, однако это приведет к отключению жестов жесты в iOS 7 15 мар. 142014-03-15 00:58:36


187

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

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

ViewA навигация бар Варианта

ViewA navigate bar options

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

заполняющего пространство в опции "Back Button"

Fill space in "Back Button" option

Результат:

The Result:

  0

Добро пожаловать в [so]. Если вы еще этого не сделали, взгляните на то, что мы 're [about], и прочитайте некоторые статьи в [help] о том, как мы работаем, и некоторые из местных обычаев здесь. Если вам нужна помощь в функциях сайта, не бойтесь искать, а затем спрашивайте вопрос на [meta] (если вы все еще не нашли ответа) Спасибо, и удачи! В любом случае, вы можете размещать свои изображения сейчас ... :) 30 ноя. 132013-11-30 13:25:49

+50

это работает, просто обратите внимание - вам нужно установить " Back Button "для ** предыдущего ** контроллера (например, для rootViewCont ролик в вашем навигационном контроллере) 17 фев. 142014-02-17 20:42:14

  0

Убедитесь, что у вас нет «hidesBackButton», установленного в TRUE на элементе навигации в ViewA 11 май. 142014-05-11 23:20:27

  0

Мне кажется, что это работает, если заголовок контроллера представления достаточно длинный - если это короткий заголовок, он будет вместо этого. 29 авг. 142014-08-29 10:11:53

+1

для меня это работает только тогда, когда ** оба ** источник и пункт назначения NavigationController для ViewController имеют «обратную кнопку», установленную на один пробел (т. Е. Как ViewA, так и ViewB) 30 дек. 142014-12-30 01:10:37

  0

Можно ли запрограммировать кнопку «Назад»? 16 апр. 162016-04-16 14:26:00

  0

@Aju Изменение кнопки назад программно: http://stackoverflow.com/a/19131107/3052059 16 апр. 162016-04-16 15:37:13

  0

Для меня достаточно определить его в контроллере ** назначения ** на ** iOS 11 **. 25 янв. 182018-01-25 00:29:40


2

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

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

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

1

Я применил следующий код в 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


0

Чтобы добавить Thomas C's answer выше, иногда помещая единое пространство не работать, и вам нужно продолжать добавлять пробелы.

empty bar button

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


-1

Это сделал трюк для меня

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

Все лучшее

  0

Если название корня длинное, тогда название ребенка не будет находиться в центре. 19 июл. 142014-07-19 23:18:39


6

Цель: настраивая все назад кнопку на 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 
    } 
  0

Это показывает предупреждение «Неявная версия SYSTEM_VESION _...» недействительно на C99. 06 авг. 142014-08-06 07:10:51


22

Хотя Kyle Begeman's answer полностью делает трюк, это очень раздражает, чтобы иметь этот код в виде контроллере возможно. Я закончил с простой категорией UINavigationItem. Опасайтесь, вот драконы! К сожалению, я имею в виду, swizzling:

+1

Я одобрил, но затем решил использовать более простой взлом - '[[Внешний вид UIBarButtonItem] setBackButtonTitlePositionAdjustment: UIOffsetMake (-1000, -1000) forBarMetrics: UIBarMetricsDefault];' ([source] (http: //www.fousa .be/blog/empty-back-button-in-ios-7)) - может быть немного менее изящным, но swizzling чувствовал себя как overkill 31 мар. 142014-03-31 19:34:25

+2

Серьезно y'all ... не проходите, идите на любое другое решение. Внесите решение @nicky в категории категории и не думайте дважды. Это отличное многоразовое решение, которое можно реализовать с помощью приложения, если вы добавите этот файл Prefix.pch. Apple рекомендует использовать [категории для добавления методов в существующие классы] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html), вы должны воспользоваться этим, когда это возможно. 10 мар. 152015-03-10 01:10:02

  0

Это лучшее решение, на мой взгляд, в любом случае «method_exchangeImplementation» немного небезопасно, взгляните на это: [Правильный способ swizzle] (https://blog.newrelic.com/2014/04/16/right (http://nshipster.com/method-swizzling/) 13 янв. 162016-01-13 11:27:08

  0

@ AlessandroOrrù В этом конкретном случае это должно быть безопасным, потому что swizzled метод является 'UINavigationItem' ' s собственный метод, нет наследования. И '_cmd' вряд ли будет участвовать в геттере. В любом случае, это хороший момент. Так что, если у вас есть какой-либо из этих многочисленных мастеров-свингеров в вашем проекте, убедитесь, что вы тоже используете его здесь. 13 янв. 162016-01-13 13:41:03


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

} 

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 

52

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

- (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; 
} 

Icon-back.png

Icon-Back

[email protected]

Icon-Back@2x

[email protected]

Icon-Back@23x

+3

С помощью этого решения вы, похоже, теряете функциональность «салфетки для возврата». 07 дек. 162016-12-07 10:33:52

+8

'navigationController? .interactivePopGestureRecognizer? .delegate = self' делает трюк, чтобы сохранить жест назад. 23 янв. 172017-01-23 17:01:46


25

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

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

As per the image below. This works for iOS 7 and iOS 8

  0

Я попробовал, он работает. Но я все еще не могу изменить заголовок в коде. 18 июл. 162016-07-18 03:26:04

  0

Работал с XCode7, но больше не работает в xCode8 -> ios10.X, я использовал метод @iwasrobbed 08 фев. 172017-02-08 10:52:53

  0

Весь гений прост! 20 сен. 172017-09-20 10:37:52


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; 
} 

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


3

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

Вот метод, использующий метод 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 
    } 
} 
} 
  0

Установите кнопку «Назад» на слово назад, отлично работает: self.navigationItem.backBarButtonItem.title = @ «Назад»; 02 май. 162016-05-02 11:22:52

  0

Что вы имеете в виду помощник? Вопрос состоял в том, чтобы удалить текст из кнопки «Назад»? 07 май. 162016-05-07 08:35:14

+1

Многие приложения и собственные приложения Apple говорят «<Назад», поэтому хорошо придерживаться стандарта. BigTakeAway и JustEat. 07 май. 162016-05-07 20:53:49


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; 

0

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

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

UPDATE:

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

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 Панель навигации, добавьте пользовательское обратное изображение кнопки без заголовка, цвет оттенка которого будет отражать цвет изображения. Пожалуйста, следуйте этой ссылке на apple apple.

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

8

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

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

Swift 3

В viewDidLoad добавить это в View Controller вы хотите кнопку назад, чтобы быть просто стрелка.

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

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


0
  1. Добавить UIBarButtonItem в UINavigationItem налево
  2. Изменить UIBarButtonItem как хотите использовать
  3. Теперь нажмите UINavigationItem и красть barBackButtonItem из точек слева UIBarButtonItem

enter image description here


1

Проверить это ответ

How to change the UINavigationController back button name?

установить title текст string с одним пробелом, как показано ниже

title = " " 

Не хватает репутации добавлять комментарии :)


0

Вы можете разместить эту категорию в AppDelegate.m файле. удаляет текст со всех кнопок по умолчанию в UINavigation. Только стрелка «<» или установите пользовательский образ, если вам нужно.

Objective-C:

...

@end

@implementation UINavigationItem (Extension) 

- (UIBarButtonItem *)backBarButtonItem { 

    return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; 
} 

@end

0

Установите обратно название кнопки элемента, как пустая строка.

[self.navigationController.navigationBar.backItem setTitle: @ ""];

+1

эта вещь уже была подчеркнута и в другом ответе, она не приносит что-то новое или не охватывает новый аспект для этого вопроса.! 27 окт. 172017-10-27 05:31:45


0

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

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 
      } 
     } 
    } 

}