제목없는 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.