26 ответов:
в интерфейсе строителя, вы можете выбрать пункт навигации предыдущего контроллера и изменить
Back Buttonстрока, что вы хотели бы кнопку назад, чтобы выглядеть как. если вы хотите, чтобы он был пустым, например, просто поставьте пробел.вы можно также изменить его С этой строкой кода:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];или Свифт:
self.navigationItem.backBarButtonItem?.title = ""
вы также можете сделать это с помощью раскадровки. В инспекторе атрибутов элемента навигации предыдущие контроллер вы можете установить "" в поле кнопки. См. изображение ниже. Заменить "ваше название здесь "на"". Делая это, вы добьетесь желаемого результата. Вам больше не нужно возиться с "титулом".
программно можно использовать
[self.navigationItem.backBarButtonItem setTitle:@" "];здесь self относится к контроллеру, который нажимает нужный контроллер вида.
образец До, После панели навигации
до
после
вы можете реализовать UINavigationControllerDelegate следующим образом:
старый Свифт
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil) viewController.navigationItem.backBarButtonItem = item }SWIFT 4.x
class MyNavigationController: UINavigationController, UINavigationControllerDelegate { override func viewDidLoad() { super.viewDidLoad() self.delegate = self } func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) viewController.navigationItem.backBarButtonItem = item }}
backBarButtonItem по умолчанию равен нулю, и это влияет на следующий толкнул контроллер, так что вы просто установите его для всех контроллеров
еще одно решение этой проблемы для ситуаций, когда у вас есть много контроллеров вида, чтобы использовать
UIAppearanceпрокси, чтобы эффективно скрыть текст заголовка кнопки Назад следующим образом:UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]; [navBarButtonAppearance setTitleTextAttributes:@{ NSFontAttributeName: [UIFont systemFontOfSize:0.1], NSForegroundColorAttributeName: [UIColor clearColor] } forState:UIControlStateNormal];это решение будет отображать текст в виде крошечной четкой точки, аналогично ручной установке заголовка кнопки Назад в
@" ", за исключением того, что она влияет на все кнопки панели навигации.Я не предлагаю это в качестве общего решения проблемы, поскольку он влияет на все кнопки панели навигации. Он переворачивает парадигму, так что вы выберите когда показывают названия кнопок, а не когда скрыть титулы.
чтобы выбрать, когда показывать заголовки, либо вручную восстановить атрибуты текста заголовка по мере необходимости, либо создать специализированный подкласс
UIBarButtonItemчто делает то же самое (возможно, с другойUIAppearanceпрокси-сервер).если у вас есть приложение, в котором большинство заголовков кнопок Назад должны быть скрыты, и только несколько (или ни одного) из nav кнопки-это системные кнопки с названиями, это может быть для вас!
(Примечание: изменение размера шрифта необходимо, даже если цвет текста ясен, чтобы гарантировать, что длинные заголовки не вызывают смещение заголовка центральной навигационной панели)
установка заголовка кнопки Назад в
@""илиnilне будет работать. Вам нужно установить всю кнопку пустой (Без названия или изображения):С
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];Свифт
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)Это должно быть сделано на контроллере вида, который находится поверх вашего контроллера вида в навигационном стеке (т. е. оттуда, где вы переходите к своему VC через
pushViewControllerспособ)
добавьте следующий код в viewDidLoad или loadView
self.navigationController.navigationBar.topItem.title = @"";Я тестировал его в iPhone и iPad с iOS 9
вы можете добавить эту категорию Objective-C, чтобы все кнопки" Назад", созданные навигационным контроллером, не имели текста. Я просто добавил его в свой AppDelegate.m-файл.
@implementation UINavigationItem (Customization) /** Removes text from all default back buttons so only the arrow or custom image shows up. */ -(UIBarButtonItem *)backBarButtonItem { return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @endPS - (Я не знаю, как заставить это расширение работать с Swift, у него были странные ошибки. Редактирование добро пожаловать, чтобы добавить версию Swift)
чтобы удалить текст из backbutton программно, используется ниже кода это будет работать форма xcode7 и выше.
self.navigationController.навигационная панель.topItem.title = @" ";
или
вручную в раскадровке выберите Панель навигации на контроллере вида и поместите ""в текст кнопки "Назад".
Это будет работать. спасибо
единственное, что работает без побочных эффектов, это создать пользовательскую кнопку Назад. Пока вы не предоставляете пользовательское действие, даже жест слайда работает.
extension UIViewController { func setupBackButton() { let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = customBackButton }}к сожалению, если вы хотите, чтобы все кнопки назад не имели никаких названий, вам нужно настроить эту пользовательскую кнопку назад во всех ваших контроллерах вида:/
override func viewDidLoad() { super.viewDidLoad() setupBackButton() }очень важно, чтобы вы установили пробел в качестве заголовка, а не пустую строку.
текущий ответ не работает. Я хотел удалить заголовок полностью, но текст "назад" не уходил.
вернитесь к предыдущему контроллеру вида и установите его свойство title:
self.title = @" ";только работает, когда предыдущий контроллер вида не имеет названия
установите заголовок предыдущего VC в "" строку с пробелом. и заголовок с кнопкой Назад будет заменен на одну строку пробела.
Self.title = " "на задней панели нажмите еще раз сбросить заголовок до исходного в viewWillAppear.
В Swift3,
Если вы установили глобальную настройку
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // .. let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal) BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted) // ... }
Я пробовал все в этом посте. Единственное рабочее решение-это @VoidLess
вот тот же ответ, но более полный
class CustomNavigationController: UINavigationController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.delegate = self } } // MARK:UINavigationControllerDelegate extension CustomNavigationController { func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) } }
используйте пользовательский
NavigationController, который переопределяетpushViewControllerclass NavigationController: UINavigationController { override func pushViewController(_ viewController: UIViewController, animated: Bool) { viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) super.pushViewController(viewController, animated: animated) } }
альтернативный способ-использовать пользовательский класс NavigationBar.
class NavigationBar: UINavigationBar { var hideBackItem = true private let emptyTitle = "" override func layoutSubviews() { if let `topItem` = topItem, topItem.backBarButtonItem?.title != emptyTitle, hideBackItem { topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil) } super.layoutSubviews() } }то есть, это удалить обратно названия всего проекта. Просто установите пользовательский класс для UINavigationController.
Swift 3.1 Это можно сделать, реализовав метод делегата UINavigationController.
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { /** It'll hide the Title with back button only, ** we'll still get the back arrow image and default functionality. */ let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil) viewController.navigationItem.backBarButtonItem = item }
для тех, кто хочет скрыть название кнопки назад по всему миру.
вы можете выпить
viewDidLoadнаUIViewControllerтакой.+ (void)overrideBackButtonTitle { NSError *error; // I use `Aspects` for easier swizzling. [UIViewController aspect_hookSelector:@selector(viewDidLoad) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> aspectInfo) { UIViewController *vc = (UIViewController *)aspectInfo.instance; // Check whether this class is my app's view controller or not. // We don't want to override this for Apple's view controllers, // or view controllers from external framework. NSString *className = NSStringFromClass([vc class]); Class class = [NSBundle.mainBundle classNamed:className]; if (!class) { return; } UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil]; vc.navigationItem.backBarButtonItem = backButton; } error:&error]; if (error) { NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription); } }использование:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[self class] overrideBackButtonTitle]; return YES; }
в iOS 11 мы нашли эту настройку
UIBarButtonItemтекстовый шрифт/цвет внешнего вида до очень малого значения или четкого цвета приведет к исчезновению другого элемента панели (система больше не уважает класс элемента UIBarButton, он преобразует его в_UIModernBarButton). Кроме того, установка смещения заднего текста за пределы экрана приведет к вспышке во время интерактивного pop.так мы swizzled
addSubView:+ (void)load { if (@available(iOS 11, *)) { [NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil]; } } - (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view { view.alpha = 0; if ([view isKindOfClass:[UIButton class]]) { UIButton *button = (id)view; [button setTitle:@" " forState:UIControlStateNormal]; } [self MyiOS11BackButtonNoTextTrick_addSubview:view]; }
Это мое разрешение для iOS11, я изменяю внешний вид UIBarButtonItem в applicationDidFinishLaunchingWithoptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)вы не можете изменить смещение Y, потому что это изменит положение кнопки задней панели тоже в iOS11, но это нормально в iOS10 и ниже.
наконец-то найдено идеальное решение, чтобы скрыть обратный текст по умолчанию во всем приложении.
просто добавьте одно прозрачное изображение и добавьте следующий код в свой AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Я боролся с этим, потому что у меня нестандартный навигационный контроллер. Я смог удалить текст заднего элемента во всех контроллерах представления с помощью этого кода в моем пользовательском классе навигационного контроллера
override func viewDidLayoutSubviews() { self.navigationBar.backItem?.title = "" }это удаляет все заголовки задних элементов с помощью этого пользовательского навигационного контроллера.
-(void)setNavigationItems{ UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)]; self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem; } -(void)backButtonClicked{ [self.navigationController popViewControllerAnimated:YES]; }
много уже ответов, вот мои два цента на эту тему. Я нашел этот подход действительно надежным. Вам просто нужно поместить это в viewController перед segue.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
следующий метод работает на iOS 11 и безопасен, чтобы не разбиться на других версиях iOS. Это может привести к отклонению вашего приложения в обзоре App Store, поскольку UIModernBarButton и UIBackButtonContainerView являются частными API. Место в AppDelegate.
if let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type, let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type { let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self]) backButton.setTitleColor(.clear, for: .normal) }
Swift версия, отлично работает в глобальном масштабе:
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 }
это из моего xamarin.формирует код, класс происходит от
NavigationRendererNavigationBar.Items.FirstOrDefault().BackBarButtonItem = new UIBarButtonItem( "", UIBarButtonItemStyle.Plain, null);



Comments