UINavigationController“뒤로 버튼”사용자 정의 텍스트?


147

기본적으로 "뒤로 단추" UINavigationController는 스택의 마지막보기 제목을 표시합니다. 뒤로 버튼에 사용자 정의 텍스트를 넣는 방법이 있습니까?


1
이 작업은 나를 위해self.navigationController.navigationBar.topItem.title = @"Custom text";
huync

답변:


342

에서 이 링크 :

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

타일러가 댓글에서 말했듯이 :

보이는 뷰 컨트롤러 에서이 작업을 수행하지 말고 뒤로 버튼을 누르면 볼 수있는 뷰 컨트롤러 에서이 작업을 수행하십시오


4
당신은해야 release합니다 UIBarButtonItem.
Mehrdad Afshari

217
또한 뷰 컨트롤러에서 스택을 한 수준 높이기 위해이 작업을 수행해야합니다. 다시 말해, 보이는 뷰 컨트롤러에서이 작업을 수행하지 말고 뒤로 버튼을 눌렀을 때 표시되는 뷰 컨트롤러에서이 작업을 수행하십시오.
Tyler

6
처음에는 이것을 이해하지 못했기 때문에 Tyler의 의견을 명확히하기 위해 :보기 컨트롤러에서 backBarButtonItem 설정 navigationItem 은이보기 컨트롤러로 돌아 가기를 표시하는 버튼을 설정합니다. 화살표 버튼에는 버튼 스타일이 없지만이 버튼은 어쨌든 화살표 스타일을 갖습니다. UIBarButtonItemStylePlain을 사용했지만 여전히 화살표 버튼 스타일을 얻습니다.
Jon Steinmetz

3
제안 : 스타일을 가정하지 말고 현재 설정된 스타일을 전달하십시오. 이 답변의 코드 UIBarButtonItemStyleBordered에서 property 호출로 대체하십시오 self.navigationItem.backBarButtonItem.style. 설명서 : developer.apple.com/library/ios/documentation/uikit/reference/…
Basil Bourque

1
ARC에서는 자동 릴리스 통화를 종료해야합니다. 그래서 당신은 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle : @ "Custom Title"style : UIBarButtonItemStyleB ordered target : nil action : nil];
bkbeachlabs

43

인터페이스 빌더에서 텍스트를 설정할 수 있습니다.

뒤로 버튼으로 돌아갈 ViewController의 탐색 항목을 선택하십시오.

여기에 이미지 설명을 입력하십시오

유틸리티 패널 속성 관리자에서 뒤로 버튼에 대한 레이블을 입력하십시오.

여기에 이미지 설명을 입력하십시오

허용 된 답변과 같이 코드에서 제목을 설정하는 것 보다이 접근법을 선호합니다.

또한 뷰 컨트롤러에서 스택을 한 수준 높이기 위해이 작업을 수행해야합니다. 다시 말해서, 보이는 뷰 컨트롤러에서이 작업을 수행하지 말고 뒤로 버튼을 눌렀을 때 표시되는 뷰 컨트롤러에서이 작업을 수행하십시오.
타일러


이것이 지금까지 찾은 최고의 답변입니다.
Ayan Sengupta

2
명확하게하려면 뷰 컨트롤러의 속성 관리자 자체가 아니라 뷰 컨트롤러의 탐색 항목에서 설정해야합니다.
Patrick 읽기

이것이 내가 찾은 최고의 답변입니다.
bicepjai

이것이 가장 좋은 답변입니다
Alex Brown

2
Xcode 6.1.1부터 iOS 7에서 실행되면 원래 이전보기 제목이 여기에서 설정 한 뒤로 버튼 제목을 무시합니다. 이전보기의 제목에 11자를 초과하면 다음보기의 뒤로 버튼에 "뒤로"라고 표시됩니다. 여기서 가장 인기있는 답변에 표시된 것처럼 처음부터 새 탐색 모음 항목을 작성하는 것 외에는 다른 방법이 없습니다.
ray

22

나는 이것을 사용한다 :

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

이것은 거의 나를 위해 작동하지만 내가 뒤로 버튼을 클릭하면, 텍스트 변경 :-( 애니메이션의 기간 동안 부모의 제목에 백업
대니 Tuppeny에게

3
스택에서 컨트롤러의 뒤로 버튼 제목이 변경됩니다. 현재 표시된 컨트롤러의 뒤로 단추 제목은 변경되지 않습니다. 더 나쁜 것은 : 컨트롤러의 제목을 이전 컨트롤러로 변경합니다!
leviathan

다른 의견가들이 언급했듯이,이 방법은 조금 불가능합니다. API가 실제로 사용하려는 방식이 아니기 때문에 권장하지 않습니다. 앞으로 어려운 버그가 발생할 수 있습니다!
RickDT

11

다음과 같이 다른 컨트롤러를 스택에 푸시하기 전에 컨트롤러 제목을 설정하여 편리한 솔루션을 찾았습니다.

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

그런 다음 다음 viewWillAppear과 같이 원본 제목을 설정하십시오 .

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

UINavigationController푸시 작업 중에 뒤로 버튼을 구성 할 때 의 기본 동작은 이전 컨트롤러의 제목을 사용하는 것이므로 작동합니다 .


1
이것에 대한 문제는 이전 뷰에서 제목이 변경되어 애니메이션으로 표시되고 약간 naff로 보입니다. 여기에 주어진 해결책 중 어느 것도 원하는대로 작동하지 않는 것 같습니다 :-(
Danny Tuppeny

1
이전 화면에 NavBar를 표시하지 않고 새 화면의 뒤로 버튼에서 titleLabel을 제거하고 iOS7 쉐브론 화살표 만 있기 때문에 상황에 완벽합니다. 따라서 제목에 빈 NSString 리터럴을 설정할 수 있습니다.
siburb

다시 누른 경우에 예외가 발생하는 뷰 컨트롤러 추진
수밋

7

뒤로 버튼의 제목은 기본적으로 이전보기의 제목으로 설정되므로 사용하는 빠른 트릭은 이전보기의 .m 파일에 다음 코드를 배치하는 것입니다.

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

이것은 많은 경우에 꽤 잘 작동하며 매우 간단합니다 ... 관찰 만이 이러한 방법 중 하나를 재정의하면 새로운 방법의 어느 시점에서 super의 구현이 호출되어야한다는 것입니다.
izk

2
이 방법을 사용하면 푸시 애니메이션이 발생하기 전에 상위 뷰의 제목이 '뒤로'로 변경됩니다. (그리고 sorta는 짜증나는데, 이것을 viewDidDisappear 메소드로 이동하면 푸시 후에 스위치가 발생하는 것을 볼 수 있습니다.)
James Boutcher

나는이 방법을 좋아하지만 이것으로 직면하는 문제는 "Original Title"이 올바르게 설정되어 있지만 뷰가 아직 뷰 계층 구조에 없기 때문에 "Back"보다 길면 줄임표가 붙어 있다는 것입니다. 제목보기를 릴레이하지 않습니다. 위의 @JamesBoutcher가 설명한 문제는 애니메이션의 초기 속도가 빠르기 때문에 눈에 띄지 않습니다. 사실, 나는이 문제가 두드러 질 때 느리게 끝나는 애니메이션으로 인해 내가 직면 한 문제가 특히 두드러진다는 것을 깨달았습니다.
trss

stackoverflow.com/questions/1441699/… 의 답변은 필요한 것보다 더 많은 사용자 정의처럼 느껴지 지만 문서화 된 방법이며 더 중요한 것은 우리의 의도에 더 부합하는 것 같습니다.
trss

6

init 메소드에서 다음 코드를 추가하십시오.

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

그런 다음 viewcontroller가 해제되도록 간단한 방법을 추가하십시오.

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

3

viewDidLoad 또는 loadView에 다음 코드를 추가하십시오.

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

iOS 9이 설치된 iPhone 및 iPad에서 테스트했습니다.


self.navigationController? .navigationBar.backItem?
.title

1
내가 필요한 유일한 차이점은 navigationControllertopItem속성 에 대한 옵션 체인입니다 .self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel

2

고삐의 답변에 추가. Apple의 문서에서 backBarButtonItem 의 선언은 다음 과 같습니다.

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

따라서 rein의 대답은 합성 된 setter가 retain전달한 인스턴스를 명시 적으로 해제하지 않기 때문에 메모리가 누출됩니다 . 다음을 사용하여이 문제를 해결할 수 있습니다autorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

또는 인스턴스에서 변수를 가리켜 나중에 명시 적으로 해제 할 수 있습니다.

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

도움이 되었기를 바랍니다!


요즘 ARC를 사용하면 자동 릴리스에 대해 걱정할 필요가 없습니다. 실제로 ARC 지원 프로젝트
Eric Goldberg

2
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

2

흥미로운 것을 발견했습니다. 서브 클래스를 작성하고 메소드를 UINavigationController대체하고 pushViewController:animated:다음과 같이하십시오 : (ARC를 사용하고 있음을 명심하십시오)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

그런 다음 ViewControllers내비게이션 컨트롤러로 눌린 모든 항목 에 자동으로 "뒤로"버튼이 있습니다. 특정 뷰 컨트롤러의 텍스트를 변경하려면 뷰 컨트롤러를 특정 클래스 또는 사용자 정의 프로토콜 (뷰 컨트롤러가 상속하는 메소드로 상속 할 수 있음)으로 캐스트 할 수 있습니다backButtonText 하거나 할 수 있습니다. 뒤로 버튼 텍스트를 사용자 정의 할 수 있도록 제공되는 뷰 컨트롤러에 대한 특정 정보. 이제 뒤로 단추 텍스트는 전적으로 책임을 져야하는 장소에서 처리됩니다. 나는 텍스트를 바꾸는 새로운 버튼을 만드는 것이 짜증나는 것을 인정해야하지만, 오.

아무도 왜 이렇게하지 않는 이유를 생각할 수 있습니까? 내비게이션 컨트롤러에서 뷰 컨트롤러를 푸시하기 전에 뷰 컨트롤러 제목으로 바이올린을 피우거나 새로운 뒤로 버튼을 만들지 않아도됩니다.


0

고삐의 대답은 잘 작동합니다.

둘 이상의 뷰 컨트롤러를 누르면 각 뒤로 변경되는 뒤로 단추 제목이 나타나며 원하는대로 표시되지 않을 수 있습니다.

이 경우 뷰 컨트롤러를 누를 때마다 사용자 정의 UIBarButtonItem을 작성해야합니다.

또한 뷰 컨트롤러 누르기 전에 수행해야합니다 . 그렇지 않으면 제목이 변경 될 때 화면 딸꾹질이 나타납니다.


0

Aubrey의 제안을 확장하면 자식 뷰 컨트롤러 에서이 작업을 수행 할 수 있습니다.

부모의 navigationItem.title 및 부모의 navigationItem의 이전 값을 저장하기위한 두 개의 변수를 만듭니다.

UINavigationItem* oldItem;
NSString* oldTitle;

viewDidLoad다음을 추가하십시오.

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

viewWillDisappear다음을 추가하십시오.

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

완벽하지 않습니다. 새 컨트롤러가 애니메이션으로 표시 될 때 상위 뷰의 제목이 변경되는 것을 볼 수 있습니다. 그러나 이것은 뒤로 단추를 사용자 정의 레이블로 지정하고 표준 뒤로 단추 모양을 유지하는 목표를 달성합니다.


0

이것을 당신에게 넣으십시오 viewDidLoad, 그것이 당신이 찾고있는 결과가되기를 바랍니다.

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

0

신속한 3에서 ARRIVING 컨트롤러 (때로는 더 많은 논리 ..)에서 제목을 설정하려면 다음을 수행하십시오.

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

다가오는 컨트롤러에서 :

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

일반적으로 self.setBackButtonNavBar를 컨트롤러 확장에 넣습니다.


0

나는 이것이 오래된 질문이며 답변의 종류가 업데이트되었음을 ​​알고 있습니다!

가장 쉬운 방법은 부모 ViewController 에서이 작업을 수행하는 것입니다.

즉, 다음 뷰 컨트롤러로 연결되는 컨트롤러입니다.

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

-1

코드에서이 작업을 수행하면의 뒤로 단추 스타일이 제거 UINavigationConroller됩니다. 각보기에 탐색 항목을 추가하는 경우의에서 하단 버튼 제목을 설정할 수 있습니다 StoryBoard.

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