제목없는 UINavigationBar 사용자 정의 뒤로 버튼


231

제목없이 iOS 7 이상에서 탐색 뒤로 버튼을 어떻게 사용자 정의 할 수 있습니까? (화살표 만)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

나는 그들이 self.backButtonItem을 가지고 있는지 궁금합니다.

또는

이 같은?

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

3
당신은 사용자 정의 색상 및 제목없이 갈매기를 만들기 위해 @hiroshi 응답 + 네비게이션 바하려면 tintColor 속성을 사용할 수 있습니다
드미트리 주코프

탭 막대가 있고 뒤로 버튼의 텍스트를 원하지 않는 사람들의 경우 수정 사항은 TabBarController 의 viewDidLoad () 에서 다음과 같습니다. self.navigationItem.backBarButtonItem = UIBarButtonItem (title : "", style :. 일반, 목표 : 없음, 행동 : 없음)
Borzh

답변:


313

실제로는 매우 쉽습니다. 여기 내가하는 일이 있습니다.

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

스위프트 2

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

스위프트 3

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

이 라인을 스택으로 밀고있는 뷰 컨트롤러 ( 이전 뷰 컨트롤러 )에 넣습니다 . 새로 누른 뷰 컨트롤러 뒤로 버튼은 이제 initWithTitle에 넣은 모든 것을 보여줍니다.이 경우 빈 문자열입니다.


3
나는 이것을 사용했지만 제목은 애니메이션 방식으로 나타나고 사라집니다 ??
user1010819 4

7
고마워 카일! iOS 7에서 기본 뒤로 버튼의 이름을 바꾸는 방법을 찾고 있었는데 이것을 prepareForSegue뷰 컨트롤러에 넣고 완벽하게 작동했습니다.
yiwei

1
@ user1010819 이것은 예상되는 동작이며, 뷰 컨트롤러를 전환 할 때 barButtonItems가 애니메이션으로 움직이거나 꺼집니다. 무엇을 이루려고 노력하고 있습니까?
Kyle Begeman

1
@YiweiGao 문제 없습니다! 올바른 코드를 알고 있다면 매우 간단합니다. 도움이 되었기 때문에 기쁘다!
Kyle Begeman

3
업데이트가 필요하다고 생각합니다. 지금은 아무것도 표시되지 않습니다. 기본적으로 화살표가 없습니까?
Mathijs Segers

198

iOS 단일 화살표로 뒤로 버튼을 만드는 쉬운 방법을 찾았습니다.

네비게이션 컨트롤러가 ViewB에서 ViewA로 이동한다고 가정 해 봅시다. IB에서 ViewA의 탐색 모음을 선택하면 제목, 프롬프트 및 뒤로 버튼 옵션이 표시됩니다.

ViewA 탐색 모음 옵션

ViewA 탐색 모음 옵션

트릭은 이전 보기 컨트롤러 (보기 A) 의 옵션에서 운명보기 컨트롤러 뒤로 버튼 제목 (ViewB)을 선택하는 것입니다 . "뒤로 단추"옵션을 채우지 않으면 iOS는 이전 보기 컨트롤러의 제목 과 함께 제목을 "뒤로"자동으로 넣습니다 . 따라서이 옵션을 단일 공백으로 채워야합니다.

"뒤로 단추"옵션으로 공간 채우기

"뒤로 단추"옵션으로 공간 채우기

결과:

결과:


스택 오버플로에 오신 것을 환영합니다 . 아직 방문하지 않은 경우 둘러 보고있는 내용을 살펴보고 도움말 센터 에서 Google의 작동 방식 및 커뮤니티 관습 에 대한 기사를 읽어보십시오 . 사이트 기능에 대한 도움이 필요하면 검색을 두려워하지 말고 메타 스택 오버플로 에 대한 질문을하십시오 (아직 답을 찾을 수없는 경우). 감사합니다, 행운을 빌어 요! 어쨌든, 당신은 지금 당신의 이미지를 게시 할 수 있습니다 ... :)
Qantas 94 Heavy

53
작동합니다.주의를 기울여야합니다. 이전 컨트롤러 (예 : 내비게이션 컨트롤러의 rootViewController)에 대해 "뒤로 단추"를 설정해야합니다.
evfemist

당신은 ViewA의 탐색 항목 TRUE로 "hidesBackButton"세트가 없는지 확인

발표 컨트롤러의 제목이 충분히 길면 이것이 작동하는 것으로 보입니다. 짧은 제목이면 대신 사용됩니다.
amergin

1
때 나를 위해 그것을에만 작동 모두 원본 및 대상의 ViewController의 NavigationItem이 한 Back Button하나의 공백 문자로 설정 (즉, ViewA 및 ViewB 모두)
dcestari

72

그냥 이미지를 사용하십시오!

OBJ-C :

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

스위프트 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-Back.png

아이콘 백

Icon-Back@2x.png

Icon-Back @ 2x

Icon-Back@3x.png

Icon-Back @ 23x


4
이 솔루션을 사용하면 "뒤로 스 와이프"기능을 잃어버린 것 같습니다.
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = self슬쩍 다시 제스처를 유지하는 트릭을 수행
빅터 Carmouze

나는이 답변, 아마도 내 평생, 즉 액션 선택기를 찾고있었습니다.
Des

29

iOS7에는 새로운 인터페이스 규칙이 있으므로 UIView를 누를 때 최소한 뒤로 화살표를 유지하는 것이 좋습니다. 프로그래밍 방식으로 "뒤로"텍스트를 변경하는 것은 매우 쉽습니다. 보기를 푸시하기 전에이 코드를 추가하십시오 (StoryBoards를 사용중인 경우에는 PreparingForSegue).

-(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
이것은 실제로 잘 작동하며 다른 옵션보다 낫습니다. 예를 들어, 다른 답변과 달리 제목을 이전 값으로 다시 설정할 필요는 없습니다.
pr1001

26

할 일이 많지 않습니다. 스토리 보드 자체를 통해 동일한 결과를 얻을 수 있습니다.

루트 내비게이션 컨트롤러로 이동하여 공간을 확보하십시오. 제목이없는 뒤로 버튼을 원하는 컨트롤러가 아니라 루트 탐색 컨트롤러를 기억하십시오.

아래 이미지에 따라.  이것은 iOS 7 및 iOS 8에서 작동합니다.


나는 그것을 시도했다, 그것은 작동한다. 그러나 여전히 코드의 제목을 변경할 수 없습니다.
Yu-Lin Wang

XCode7로 작업했지만 xCode8-> ios10.X에서 더 이상 작동하지 않습니다. @iwasrobbed 방법을 사용했습니다
LucioB

모든 천재는 간단합니다!
Illya Krit

22

하지만 카일 Begeman의 대답은 완전히 트릭을 수행, 가능한 컨트롤러 모든보기에서이 코드가 꽤 성가신입니다. 나는 간단한 UINavigationItem범주로 끝났다 . 조심하십시오, 여기 용입니다! 죄송합니다.

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
나는 공감했지만 그 대신 더 간단한 해킹을 사용하기로 결정했다. [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( source )-좀 덜 우아하지만,
지글 지글 한

2
진심으로 당신은 ... 다른 해결책을 놓치지 마십시오. @nicky가 카테고리로 게시 된 솔루션을 구현하고 두 번 생각하지 마십시오. 이 Prefix.pch 파일을 추가하면 앱 전체에서 구현할 수있는 재사용 가능한 솔루션입니다. Apple은 범주를 사용하여 가능한 경우 기존 클래스에 메소드를 추가 하도록 권장 합니다.
zmonteca

이것은 내 의견으로는 가장 좋은 해결책입니다. 어쨌든 "method_exchangeImplementation"은 약간 안전하지 않습니다. 이것을 살펴보십시오. 올바른 방법으로 흔들기
Alessandro Orrù

@ AlessandroOrrù이 특별한 경우, swizzled 메소드는 UINavigationItem고유 한 메소드이므로 상속 이 없기 때문에 안전해야합니다 . 그리고 _cmd게터에 관여하지는 않을 것입니다. 어쨌든 좋은 지적입니다. 따라서, 프로젝트에 이러한 수많은 스위 즐링 도우미가 있다면 여기에서도 사용하십시오.
secondcitysaint

21

편집 : 2014-04-09 : 명성을 얻었을 때 더 이상이 트릭을 사용하지 않기 때문에 미안합니다. 카일의 대답을 추천합니다. 또한 selfof self.navigationItem.backBarButtonItem는 뷰 컨트롤러 뒤로 버튼이 표시되지 않지만 이전 뷰 컨트롤러는 되돌아갑니다.

이전 뷰 컨트롤러의 제목 텍스트가 필요하지 않은 경우 제목을 빈 문자열로 채 웁니다.

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

이렇게하면 푸시 뷰 컨트롤러에서 갈매기 형 표시기가 "뒤로"표시되지 않습니다.

편집 : 공백이 아닌 제목 텍스트를 사용하더라도 viewWillAppear:뷰 컨트롤러가 팝업 될 때 제목이 깜박 거리는 것을 제외하고는 이전 뷰 컨트롤러의 제목을 설정하십시오 . "twitter 앱"은 깜박임을 피하기 위해 더 미묘한 해킹을하는 것 같습니다.


내가 여기에서 겪었던 문제는 탐색 바를 눌렀을 때 이전보기의 제목이 비어있을 때라는 것입니다. 그 주위에 어떤 방법이 있습니까?
Alioo

@Alioo "EDIT"줄에서 언급 한 것을 시도 했습니까?
hiroshi

20

이것은 작동하지만 다시 팝업하더라도 이전 항목의 제목이 제거됩니다.

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

viewDidLoad푸시 된 View Controller 에서이 속성을 설정하기 만하면됩니다 .


17
팝업하면 이전 항목의 제목이 제거됩니다. 별로 좋지 않음 :(
Antzi

푸시 VC의 제목을 설정하여 viewWillAppear항상 올바르게 설정했습니다.
구토 아라 우호

@GutoAraujo 그것은 작동하지만 1 또는 2 초 지연 마녀와 함께 제목이 다시 나타납니다 UX는 좋지 않습니다.
fuiiii

xCode8-> ios10.X에서는 이것이 문제를 해결하는 유일한 방법 인 것 같습니다
LucioB

12

이것이 내가하는 방법과 가장 간단하고 작동하며 가장 명확한 방법입니다.

임베드시 작동합니다. Navigation Controller

스위프트 3

에서 viewDidLoad내가보기 컨트롤러이 추가 당신은 뒤로 버튼 그냥 화살표가되고 싶어요.

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

@Kyle Begeman의 대답과의 차이점은 푸시 스택보기 컨트롤러가 아닌 뒤로 버튼이 화살표가되도록하려는보기 컨트롤러에서 이것을 호출한다는 것입니다.


7

원하는 방식으로 탐색 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];
}

그런 다음 뒤로 버튼에서 발생한 멋진 페이드 아웃 애니메이션을 잃었습니다
Kiddo

3
부드러운 전환을 위해서는 마스크가 필요합니다. "* 기본 이미지를 대체하기 위해 사용자 정의 이미지를 사용하려면 사용자 정의 마스크 이미지도 생성해야합니다. iOS 7은이 마스크를 사용하여 이전 화면의 제목을 탐색 중에 갈매기 모양으로 나타나거나 사라지게합니다. 전환. "
사용자

3
@null을 사용하면 iOS 7의 좌우 스 와이프 동작이 사라집니다!
Mazen Kasser

@user 사용자 정의 이미지를 얻지 만 색조 색상은 기본적으로 파란색입니다. 색조를 추가하지 않으려면 어떻게해야합니까? 감사합니다
Mazen Kasser

7

대상 : 모든 뒤로 버튼을UINavigationBar흰색 아이콘으로 맞춤 설정

단계 : 1. AppDelete의 "didFinishLaunchingWithOptions"메소드에서 :

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

viewDidLoad공통 수퍼 ViewController클래스 의 방법에서 2 .

 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
    }

"암시 적 버전의 SYSTEM_VESION _..."경고가 C99에서 유효하지 않음을 나타냅니다.
Jayprakash Dubey

7

스위프트 4

사용자 정의 뒤로 버튼을 만들고 제목을 제거하려는 경우 뷰 컨트롤러 내에서 새 코드를 푸시하는 다음 코드를 사용하십시오.

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

보다 보편적으로 사용하려면 다음을 수행하십시오.

  1. 다음과 같이 범용 함수를 작성하십시오.

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. 그런 다음 다음과 같이 뷰 컨트롤러에서 사용하십시오.

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

iOS6의 간단한 해킹은 iOS7에서도 작동합니다.

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

편집 : 이 핵을 사용하지 마십시오. 자세한 내용은 의견을 참조하십시오.


6
이 핵을 사용하지 마십시오. 64 비트 장치의 Apple 코드에는 막대 버튼 제목 오프셋을 만들 때 모달보기가 나타나지 않도록하는 버그가 있습니다. 자세한 내용은 .
zh.

시뮬레이터가 아닌 장치에만 문제가있었습니다.
zh.

Xcode 9 / iOS 11로 빌드 할 때이 핵은 더 이상 작동하지 않습니다. "<"가 너무 낮게 표시되고 디버거에서 실행될 때 제약 조건이 깨져 나타납니다.
T'Pol

3

이것을 사용할 수 있습니다. 이것은 UIButtoncustumview로 a를 추가하여 완벽하게 작동 합니다.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;
}

3
그러나, 7 아이폰 OS에서이 뜻을 비활성화 슬쩍 다시 제스처
user102008

3

UILabel루트 뷰 컨트롤러에 원하는 제목으로를 생성하고 뷰 컨트롤러에 할당하십시오 navigationItem.titleView.

이제 제목을 빈 문자열로 설정하면 다음에 볼 컨트롤러에 텍스트가없는 뒤로 버튼이 있습니다.

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

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

}

3

모든 답변으로 문제가 해결되지는 않습니다. 모든 뷰 컨트롤러에서 버튼 제목을 뒤로 설정하는 것은 허용되지 않으며 타이틀에 오프셋을 추가하면 다음 뷰 컨트롤러 제목이 오른쪽으로 이동합니다.

다음은 메소드 스위 즐링을 사용하는 메소드입니다. 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
    }
}
}

뒤로 버튼을 단어 뒤로 설정하면 훌륭하게 작동합니다. self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel

친구 란 무엇을 의미합니까? 질문은 뒤로 버튼에서 텍스트를 제거하는 것과 관련이 있습니까?
jakub wolanski

1
많은 App과 Apple 자체의 App은 "<Back"이라고 말하므로 표준을 따르는 것이 좋습니다. BigTakeAway 및 JustEat.
Mike Zriel

2

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을 사용하십시오.


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

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;

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
이것이 정답입니다. 트릭이 없습니다. 이것은 제목을 설정하기 위해 사용되는 방식으로 iOS API를 사용하는 것입니다. 제목을 제거하려면 @ ""로 설정하십시오 (테스트되고 제대로 작동 함).
n13

1

나를 위해 일한 유일한 방법은 다음과 같습니다.

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

최신 정보:

segue 애니메이션 플래그를 true로 변경했을 때 (이전에는 false였습니다), 나를 위해 일한 유일한 방법은 다음과 같습니다.

navigationController?.navigationBar.topItem?.title = ""

1

Navigation Controller에 두 개의 ViewController (FirstVC, SecondVC)가 포함되어 있고 SecondVC에는 뒤로 화살표 만있는 경우

FirstVC의 ViewDidLoad에서 시도해 볼 수 있습니다.

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

그런 다음 SecondVC를 누르면 뒤로 화살표 만 나타납니다.


1

NavigationBar의 tintColor를 설정 한 경우 제목없이 사용자 정의 뒤로 버튼 이미지를 추가하면 색조 색상에 이미지 색상이 반영됩니다. 이 사과 문서 링크를 따르십시오.

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


1

이것을 쉽게하기 위해 확장 기능을 작성했습니다.

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

}

1

viewWillDisappear에서 제목을 현재 ViewController의 @ ""로 변경할 수 있으며 제목이 다시 표시 될 때 제목을 이전의 내용으로 재설정 할 수 있습니다.

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

첫 번째 ViewController의 PreparingForSegue : 메소드에서 뷰 제목을 @ ""로 설정하므로 다음 뷰를 누르면 이전 ViewController 제목 인 @ ""가 표시됩니다.

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

이것의 유일한 문제는 뒤로 버튼을 눌렀을 때 이전보기에 제목이 없으므로 viewWillAppear에 다시 추가 할 수 있다는 것입니다.

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

나는이 솔루션을별로 좋아하지 않지만 작동하지만 다른 방법을 찾지 못했습니다.


탐색 항목 제목을 망칠 필요없이 올바른 솔루션에 대한 내 대답을 참조하십시오.
Dima

솔루션에 iOS7 뒤로 화살표가 유지됩니까? 비슷한 것을 시도했지만 화살표가 제거되었습니다.
Alejandro Figueroa

iOS 7에서는 뒤로 화살표를 유지합니다. iOS 6에서는 blank (0 length) 문자열을 전달해도 버튼이 완전히 제거되므로 iOS 7에만 유효합니다.
Dima

매우 간단한 해결책이 있습니다. 내 대답이 당신을 위해 작동하는지 확인하십시오.
구토 아라 우호

0

의 Thomas C의 대답에 추가하기 위해 때로는 단일 공백을 넣는 것이 효과가 없으므로 공백을 계속 추가해야합니다.

빈 바 버튼

"탐색 항목"아래에 "바 단추 항목-"이 표시되면 성공한 것입니다. 그것은 문서 개요 (편집기-> 문서 개요 표시)에 있습니다. 위의 그림이 보이면 몇 개의 공백을 삭제하고 여전히 작동하는지 확인할 수 있습니다.


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

Kyle Begeman과 마찬가지로 루트 뷰 컨트롤러에서 위의 코드를 추가합니다. 모든 서브 뷰 컨트롤러가 적용됩니다. 또한 이것을 initWithCoder : 메소드에 추가하면 xib, 스토리 보드 또는 코드 기반 접근 방식의 루트 뷰 컨트롤러 스타일을 적용 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.