Подтвердить что ты не робот

UINavigationBar Скрыть текст кнопки

Как я могу скрыть текст кнопки обратной связи от контроллера UINavigation? У меня будет только "<" а не "< Назад"

4b9b3361

Ответ 1

В построителе интерфейсов вы можете выбрать элемент навигации предыдущего контроллера и изменить строку Back Button на то, что вы хотели бы, чтобы кнопка возврата появилась. Если вы хотите, чтобы он был пустым, например, просто введите пробел.

Вы можете также изменить его с помощью этой строки кода:

[self.navigationItem.backBarButtonItem setTitle:@"Title here"];

Или в Swift:

self.navigationItem.backBarButtonItem?.title = ""

Ответ 2

Вы также можете сделать это через раскадровку. В инспекторе атрибутов элемента навигации предыдущего контроллера вы можете установить "в поле" Назад ". См. Изображение ниже. Замените" Ваше название здесь "на" ". Делая это, вы достигнете желаемого результата. Вам больше не нужно связываться с" Титулом".

Программно вы можете использовать

[self.navigationItem.backBarButtonItem setTitle:@" "];

где self относится к контроллеру, который подталкивает ваш желаемый контроллер View.

Xcode view controller navigation item

Пример до, после панели навигации

До Before

После After

Ответ 3

Вы можете реализовать 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 по умолчанию равен nil и влияет на следующий заданный контроллер, поэтому вы просто устанавливаете его для всех контроллеров

Ответ 4

Установка названия кнопки "Назад" на @"" или nil не будет работать. Вам нужно установить пустую кнопку цели (без названия или изображения):

Objective-C

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

стриж

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

Это должно быть сделано на контроллере представления, который поверх контроллера просмотра в стеке навигации (т. pushViewController вы переходите к своему VC с помощью метода pushViewController)

Ответ 5

Другим решением этой проблемы для ситуаций, когда у вас много контроллеров, является использование прокси-сервера UIAppearance, чтобы эффективно скрыть текст заголовка кнопки назад, например:

UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];

[navBarButtonAppearance setTitleTextAttributes:@{
    NSFontAttributeName:            [UIFont systemFontOfSize:0.1],
    NSForegroundColorAttributeName: [UIColor clearColor] }
                                      forState:UIControlStateNormal];

Это решение отобразит текст как маленькую четкую точку, аналогичную ручному настройке заголовка кнопки "Назад" на @" ", за исключением того, что он влияет на все кнопки панели навигации.

Я не предлагаю это как общее решение проблемы, потому что оно воздействует на все кнопки панели навигации. Он переворачивает парадигму так, что вы выбираете, когда показывать названия кнопок, а не когда скрывать названия.

Чтобы выбрать, когда показывать заголовки, либо вручную восстановить атрибуты текста заголовка по мере необходимости, либо создать специализированный подкласс UIBarButtonItem, который делает то же самое (потенциально с другим прокси-сервером UIAppearance).

Если у вас есть приложение, в котором большая часть названий кнопок на задней панели должна быть скрыта, и только несколько (или ни одна) кнопок навигации являются системными кнопками с заголовками, это может быть для вас!

(Примечание: требуется изменить размер шрифта, даже если цвет текста ясен, чтобы гарантировать, что длинные заголовки не приводят к смещению заголовка центральной навигационной панели)

Ответ 6

Добавьте следующий код в viewDidLoad или loadView

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

Я тестировал его на iPhone и iPad с iOS 9

Ответ 7

Вы можете добавить эту категорию 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];
}

@end

PS - (я не знаю, как заставить это расширение работать с Swift, у него были странные ошибки. Редактирование приветствует добавление версии Swift)

Ответ 8

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

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

или

manualLy в раскадровки, выберите панель навигации на контроллере представления и поместите текст "назад" в текст кнопки.

это сработает. спасибо

Ответ 9

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

extension UIViewController {
func setupBackButton() {
    let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = customBackButton
}}

К сожалению, если вы хотите, чтобы все обратные кнопки не имели каких-либо заголовков, вам нужно настроить эту пользовательскую кнопку возврата во всех ваших контроллерах вида:/

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}

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

Ответ 10

Текущий ответ не работал. Я хотел полностью удалить заголовок, но текст "назад" не исчез.

Вернитесь к предыдущему контроллеру представления и установите его свойство title:

self.title = @" ";

ТОЛЬКО работает, когда предыдущий контроллер просмотра не имеет названия

Ответ 11

Я попробовал некоторые выше и ниже, но они не работали. Это сработало для меня:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.topItem?.title = ""
}

Ответ 12

Задайте заголовок предыдущей строки VC на "с пробелом. и название с помощью кнопки" Назад" будет заменено одиночной пробельной строкой.

Self.title = " "

Вкл. Назад снова нажмите reset название на оригинальное в viewWillAppear.

Ответ 13

Используйте пользовательский NavigationController, который переопределяет pushViewController

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

Ответ 14

Альтернативный способ - использовать пользовательский класс 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.

Ответ 15

Много ответов уже, здесь мои два цента на эту тему. Я нашел этот подход действительно надежным. Вам просто нужно поставить это в viewController перед segue.

Swift 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

Ответ 16

Я пробовал все в этом посте. Единственным рабочим решением является @VoidLess's

Вот такой же ответ, но более полный

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

Ответ 17

В 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)


    // ...

}

Ответ 18

Это мое разрешение для iOS11, я меняю внешний вид UIBarButtonItem в applicationDidFinishLaunchingWithOptions:

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)

Вы не можете изменить смещение Y, потому что оно изменит положение кнопки задней панели тоже в iOS11, но оно ОК в iOS10 и ниже.

Ответ 19

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
}

Ответ 20

Для тех, кто хочет скрыть название кнопки во всем мире.

Вы можете swizzle 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 view controller or not.
        // We don't want to override this for Apple 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;
}

Ответ 21

В iOS 11 мы обнаружили, что установка шрифта/цвета текста UIBarButtonItem с очень маленьким значением или четким цветом приведет к исчезновению другого элемента панели (система больше не соблюдает класс элемента UIBarButton, он преобразует его до _UIModernBarButton). Кроме того, установка смещения заднего текста на внеэкранный режим приведет к появлению вспышки во время интерактивной поп-музыки.

Итак, мы 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];
}

Ответ 22

Я боролся с этим, потому что у меня был пользовательский контроллер навигации. Мне удалось удалить текст обратно во всех контроллерах представлений с помощью этого кода в моем настраиваемом классе контроллера навигации override func viewDidLayoutSubviews() { self.navigationBar.backItem?.title= "" }

Это удаляет все заголовки задних элементов с помощью этого настраиваемого контроллера навигации.

Ответ 23

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

Ответ 24

self.title из последнего View Controller navigationItem.title self.title а navigationItem.title автоматически устанавливается self.title. Таким простым способом решения проблемы является ловушка setTitle: sure убедитесь, что navigationItem.title= @""

Поместите этот код в AppDelegate.m будет хорошо ok

    [UIViewController aspect_hookSelector:@selector(setTitle:)
                              withOptions:AspectPositionAfter
                               usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
        UIViewController *vc = aspectInfo.instance;
        vc.navigationItem.titleView = ({
            UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
            titleLabel.text = title;
            titleLabel;
        });
        vc.navigationItem.title = @"";
    } error:NULL];

Более подробная информация на https://www.jianshu.com/p/071bc50f1475 (Simple Chinease)

Ответ 25

Мое решение: - XCode: 10.2.1 - Swift: 5

  • Родительский viewcontroller:
    • self.title= ""
  • Детский viewcontroller:
    • self.navigationItem.title= "Your title"//чтобы установить заголовок для viewcontroller

Ответ 26

Наконец нашел идеальное решение, чтобы скрыть стандартный текст по умолчанию в целом приложении.

Просто добавьте одно прозрачное изображение и добавьте следующий код в свой AppDelegate.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

Ответ 27

Следующий метод работает на 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)
    }

Ответ 28

Если вы ориентируетесь на iOS 13 и более поздние версии, вы можете использовать этот новый API, чтобы скрыть заголовок кнопки "Назад" глобально.

let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]

UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance

Ответ 29

версия 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
    }

Ответ 30

Это из моего кода xamarin.forms, класс происходит от NavigationRenderer

NavigationBar.Items.FirstOrDefault().BackBarButtonItem = new UIBarButtonItem( "", UIBarButtonItemStyle.Plain, null);