it-swarm.com.ru

UINavigationBar Скрыть кнопку "Назад"

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

76
Nils

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

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

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

Или в Swift :

self.navigationItem.backBarButtonItem?.title = ""

93
rebello95

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

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

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

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

Xcode view controller navigation item

Образец до, после панели навигации

До Before

После After

76
Shahzin KS

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

52
VoidLess

Установка заголовка кнопки возврата на @"" или 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)

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

30
jackal

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

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

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

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

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

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

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

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

29
Adam Kaplan

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

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

Я проверил это в iPhone и iPad с iOS 9

27
alones

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

14
teradyl

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

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

или же

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

это будет работать Спасибо 

10
Jyothi Babu Pakalz

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

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

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

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}

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

8
Cezar Signori

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

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

self.title = @" ";

ONLY работает, когда предыдущий View Controller не имеет заголовка

6
ChrisHaze

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

4
LLIAJLbHOu

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

Self.title = " "

При нажатии Назад снова сбросьте заголовок к исходному в viewWillAppear.

4
Mohit Kumar

Используйте пользовательский 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)
  }
}
3
onmyway133

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

Swift 4:

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

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

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

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
}
2
S.M.Moinuddin. Shuvo

Я попробовал все в этом посте. Единственное рабочее решение - @ 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)
    }
}
2
Christos Hadjikyriacou

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


    // ...

}
2
taku_oka

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

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

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

1
VictorChee

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

Вы можете поменять 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;
}
1
nRewik

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

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

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

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

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

0
Amy.R
-(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];
}
0
neeraj singla

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

Итак, мы ползли 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];
}
0
sbhhbs