Programing

탐색 표시 줄에서 "뒤로"버튼의 제목을 변경하는 방법

lottogame 2020. 4. 23. 07:40
반응형

탐색 표시 줄에서 "뒤로"버튼의 제목을 변경하는 방법


현재 왼쪽 막대 버튼 기본값은 현재 뷰를로드 한 뷰의 제목입니다. 즉, 버튼을 누를 때 표시되는 뷰 (뒤로 버튼)입니다.

버튼에 표시된 텍스트를 다른 것으로 변경하고 싶습니다.

뷰 컨트롤러의 viewDidLoad 메서드에 다음 코드 줄을 넣어 보았지만 작동하지 않는 것 같습니다.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

어떻게해야합니까?

감사.


"NewTitle"이라는 제목의 ViewController를 호출하는 메소드에 배치해야합니다. push 또는 popViewController 문 바로 앞에 있습니다.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];

ChildVC에서 이것은 나를 위해 일했습니다 ...

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

스위프트에서도 작동합니다!

self.navigationController!.navigationBar.topItem!.title = "Back"

backBarButtonItem에 대한 문서는 다음과 같습니다 .

"이 탐색 항목이 스택의 맨 위 항목 바로 아래에 있으면 탐색 제어기는이 탐색 항목에서 탐색 모음의 뒤로 단추를 파생합니다. [...] 뒤로 단추의 사용자 정의 이미지 또는 제목을 지정하려는 경우 대신이 속성에 맞춤 바 버튼 항목 (맞춤 제목 또는 이미지 포함)을 할당 할 수 있습니다. "

View Controller A ( "부모" 보기 컨트롤러) :

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

다른 뷰 컨트롤러 B 가 탐색 스택 위에 있고 A 가 바로 아래에 있으면 B 의 뒤로 버튼에 "Short" 라는 제목이 표시됩니다 .


스토리 보드를 사용하는 Xcode 4.5에서 Back 버튼의 값이 동적으로 변경 될 필요가 없을 때 발견 한 가장 쉬운 해결책은 View Controller의 탐색 항목과 관련된 "Back Button"필드를 사용하는 것입니다. "뒤로"버튼으로 다른 것을 말하고 싶습니다.

예를 들어 아래 스크린 샷에서 푸시하는보기 컨트롤러의 뒤로 버튼을 뒤로 버튼의 제목으로 "뒤로"를 갖기를 원합니다.

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

물론, 매번 약간 다른 것을 말하기 위해 뒤로 버튼이 필요한 경우에는 작동하지 않습니다 ... 여기에 다른 솔루션이 모두 있습니다.


나는 그 질문이 매우 오래되었다는 것을 알고 있지만 좋은 해결책을 찾았습니다.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

childView에서 작동합니다! iOS 7에서 테스트되었습니다.


어쩌면 나는 단순 해 보이지만 Apple의 문서에서 문구는 다음과 같습니다.

뷰 컨트롤러 중 하나 에서 사용자 지정 막대 버튼 항목을 지정하지 않으면 기본 뒤로 버튼 이 사용되며 제목은 이전 뷰 컨트롤러의 title 속성 값, 즉 뷰 컨트롤러가 한 수준 아래로 설정됩니다. 스택.

위의 올바른 것으로 표시된 솔루션은 상위 컨트롤러의 기본 버튼 항목을 설정합니다. 정답이지만 self.title새 컨트롤러를 NavigationController 스택으로 푸시하기 전에 UIViewController의 속성을 변경하여 문제를 해결하고 있습니다.

이렇게하면 다음 컨트롤러에서 뒤로 버튼의 제목이 자동으로 업데이트되며, 설정을 self.title다시 설정하면 viewWillAppear이 방법으로 너무 많은 문제를 일으킬 수 없습니다.


이것은 나를 위해 더 잘 작동합니다. 시도 :

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];

Swift / iOS8에서 다음이 저에게 효과적이었습니다.

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Felipe의 답변에서 나온 것입니다.


자, 여기 방법이 있습니다. 뷰 컨트롤러가 "첫 번째"이고 버튼 등을 눌러 다른 뷰 컨트롤러를 "두 번째"탐색하는 경우 몇 가지 작업을 수행해야합니다. 먼저 다음과 같이 "두 번째"보기 컨트롤러의 ViewDidLoad 메서드에서 BarButtonItem을 만들어야합니다.

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

그렇게 한 후에는 같은 .m 파일에서 "btnBack"작업을위한 코드를 작성해야합니다.

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

그게 다야.


제목이 정말 긴 부모 뷰 컨트롤러가있었습니다. 이로 인해 뒤로보기 텍스트가 하위 뷰 컨트롤러의 제목으로 번져 나옵니다.

여러 가지 솔루션을 시도한 후에 이것이 내가 한 일입니다 (@ john.k.doe 접근 방식으로 확장).

Xcode 7.2, Swift 2 사용

  1. 스토리 보드 Navigation Item에서 Parent View Controller 장면 (자식 VC 아님) 에 a 추가합니다

탐색 항목

  1. Attributes Inspector새의 Navigation Item, A의 입력 space의 문자 Back Button필드. 이에 대한 자세한 내용은 나중에

계층 구조보기의 탐색 항목

뒤로 단추 필드에 공백 문자를 추가하십시오

  1. 에서 부모 뷰 컨트롤러, 다음 코드를 추가합니다 :

단편:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

설명:

뒤로 버튼 종류는 상위 뷰 컨트롤러에 속합니다. Navigation Item당신이 코드 또는 스토리 보드에서 제목을 설정할 수 있도록, 당신에게 뒤로 가기 버튼에 대한 핸들을 제공합니다.

노트 :

Navigation Item Back Button텍스트를 기본 빈 문자열로 두면 뒤로 단추 제목이 "뒤로"가됩니다.

다른 접근 방식이 작동하는 이유는 무엇입니까? :

자식 뷰 컨트롤러에서 뒤로 단추 제목을 재정의 할 수는 있지만 이미 화면에서 잠깐 깜박일 때까지 핸들을 가져 오는 것이 어려웠습니다.

일부 접근법은 새로운 뒤로 버튼을 구성하고 기존 버튼을 무시합니다. 나는 그것이 작동하고 일부 사용 사례에서 필요할 것이라고 확신합니다. 그러나 가능한 경우 기존 API를 활용하는 것을 선호합니다.

title일부 상황에서는 상위 뷰 컨트롤러를 변경하는 것이 가장 빠른 솔루션입니다. 그러나 이렇게하면 부모 제목이 변경되므로 상태를 관리해야합니다. Tab Bar Controller제목 변경 으로 인해 제목에 부작용이 발생하기 때문에 문제가 발생하기 Tab Bar Item쉽습니다.


스토리 보드를 사용하는 사용자는 부모 (대상보기를 보유하고있는 것이 아닌)보기 컨트롤러 프레임을 선택하십시오 (탐색 모음에서 마우스 오른쪽 단추를 클릭 한 다음 속성 관리자를여십시오. 여기서 세 가지 양식 입력이 있습니다. " 뒤로 버튼 "은 우리가 찾고있는 것입니다.


스위프트 버전 :

자녀의 ViewController에서 :

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

다른 방법이 있습니다.

부모보기 컨트롤러에서 다음 방법을 구현하십시오.

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

자식보기 컨트롤러에서 제목을 변경하려는 경우 다음과 같이 작동합니다.

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

나는 parentViewController재산을 작동 시킬 수 없었 습니다.

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

그게 버그인지 제대로 사용하고 있지 않은지 모르겠습니다. 그러나 viewControllers배열 에서 두 번째-마지막 뷰 컨트롤러를 잡으면 부모 뷰 컨트롤러를 가리 키므로 해당 참조를 사용하여 부모 메서드를 올바르게 호출 할 수 있습니다.


확인. 나는 개인적으로 이러한 모든 옵션을 미워했습니다. 그러므로 나는 내 자신을 생각해 냈습니다.

내가 본 정보를 기반으로합니다. 이전 뷰 컨트롤러는 푸시 된 뷰 컨트롤러에 표시되는 자체 "뒤로"버튼을 제어하는 ​​것으로 보입니다.

변경된 뒤로 버튼을 원하는 컨트롤러의 navigationItem에 대해 Lazy Load 메소드를 작성했습니다.

광산은 초대 구매자 컨트롤러입니다

구매자 초대는 기본적으로 설정된 텍스트입니다.

하지만 뒤로 버튼은 초대해야했습니다

뒤로 버튼을 만드는 데 사용한 코드는 다음과 같습니다.

이 코드를 Controller의 Implementatio (.m) 파일 맨 위에 배치하고 수퍼의 방법을 자동으로 무시합니다.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

나는 이것이 이것을 달성하는 훨씬 더 우아한 방법이라고 생각합니다.

이 코드를 한 곳에 배치하면 필요할 때 자동으로 채워집니다.

각 푸시 요청 전에 코드를 호출 할 필요가 없습니다.

도움이 되었기를 바랍니다


UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

답은 다음과 같습니다.

에서 viewDidAppear:animated(not in viewDidLoad) 다음을 수행하십시오.

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

뒤로 버튼의 모양을 유지하려면


여기에 설명 된 해결책 중 어느 것도 나를 위해 일하지 않았습니다. 그래서 내가 한 것은 다음과 같은 방식으로 내가 온 장면에서 제목을 제거하는 것입니다.

self.title = @"";

따라서 새로운 장면이 표시되면 배경 텍스트가 나타나지 않습니다.

나는 이것이 절대적인 해결책이 아니라는 점에 동의하지만, 효과가 있었고 설명 된 것도 나를 위해 일하지 않았다.


스위프트

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton

뒤로 버튼의 이름을 변경하는 가장 쉬운 방법은 뷰 컨트롤러 제목을 뒤로 버튼의 제목으로 설정 한 다음 뷰 컨트롤러 탐색 항목의 titleView를 실제 레이블이있는 사용자 정의 레이블로 바꾸는 것입니다. 이름.

이처럼 :

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

이렇게하면 UINavigationBar의 타이틀이 마치 네이티브 인 것처럼 보입니다. 뷰 컨트롤러에 타이틀과 뒤로 버튼 타이틀을 분리 할 수있는 기능을 제공합니다.

뷰 컨트롤러 A 및 B의 경우 A는 B가 표시되는 동안 뒤로 버튼의 모양을 알려줍니다.

편집 : 또한 뒤로 버튼 기본 모양을 유지합니다 (왼쪽 화살표 막대 버튼 항목).


이 코드도 작동합니다. 이것을 네비게이션 컨트롤러의 루트 컨트롤러에 넣으십시오.

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

다음보기 컨트롤러로 푸시하기 전에 탐색 스택에서 현재보기 컨트롤러의 제목을 뒤로 버튼의 원하는 텍스트로 변경하는 것이 가장 좋습니다.

예를 들어

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

그런 다음 viewDidAppear에서 제목을 원래 VC의 원하는 제목으로 다시 설정하십시오. 짜잔!


iOS의 새로운 기능이지만 내비게이션 컨트롤러 클래스를 재정의하는 간단한 답변을 제공 할 것입니다. push 및 pop 메서드를 간단히 재정의하고 이전 뷰 컨트롤러의 제목을 저장합니다. js 블록에 붙여 넣어 죄송합니다. 일반 코드 블록에 붙여 넣는 방법이 거의 혼란스럽지 않았습니다.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end


self.navigationController.navigationBar.backItem.title = @"TEXT";

그리고 스위프트에서 :

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

self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

Parrent Controller의 코드에서 원하는 위치에 배치 할 수 있으므로 다른 자식 뷰에 대해 다른 백 버튼을 가질 수 있습니다.


대부분의 솔루션은 원하는 제목의 일반적인 버튼을 추가하면서 원래 스타일의 BackButton (왼쪽 화살표 막대 버튼)을 제거합니다.
따라서 원래 스타일을 유지하려면 두 가지 방법이 있습니다.
첫째 : 문서화되지 않은 버튼 스타일 (110 또는 이와 유사한 것)을 사용하고 싶지 않습니다. 그러나 원하는 경우 여기에서 방법을 찾을 수 있습니다.
두 번째 : 나는 Trenskow의 아이디어를 사용합니다. 나는 그것을 좋아하고 조금 바꿨다.
-(NSString *) title을 재정의하는 대신 원래 제목을 다음과 같은 방식으로 유지하기로 결정했습니다. 이로 인해 푸시 상태 btw에서 주어진 제목뿐만 아니라 nib의 제목을 사용할 수 있습니다.

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

이 솔루션은 잘 작동하며 기본으로 보입니다. 또한 viewDidLoad 메소드에서 사용하면 한 번 이상 실행되지 않습니다.
또한 Jessedc의 솔루션을 시도했지만 좋지 않습니다. 원본에서 BackButton의 원하는대로 뒤로 이동하면서 사용자가 제목 표시 줄을 볼 수있게합니다.


이것은 이전에 게시 된 답변의 "간단한"버전으로 작동합니다.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

하위 뷰 또는 상세 뷰 (예 : UIViewController)가 아닌 상위 뷰 컨트롤러 (예 : 테이블 뷰 또는 UITableViewController가있는 뷰)에 코드를 배치해야합니다 .

다음과 같이 뒤로 버튼 문자열을 쉽게 지역화 할 수 있습니다.

backButton.title = NSLocalizedString(@"Back Title", nil);

우리는 두 개의 VC A와 B가 있습니다

B에서 제목을 변경하려면 A로이 코드를 작성하십시오.

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

스위프트 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)

Stan의 대답이 가장 좋았습니다. 그러나 탭 막대가있는 컨트롤러를 사용하고 컨트롤러 제목을 변경할 때 탭 막대의 제목도 변경할 수 있으므로 문제가 있습니다. 따라서 가장 좋은 대답은 view_controller.navigationItem.title 만 변경하고 view_controller.navigationItem을 사용하는 것입니다 함수에서 .title. 대답은 여기에 있습니다 : (ARC를 사용하여 뷰의 viewDidLoad에 추가하십시오)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

나 자신을 사용 하여이 기능을 viewDidLoad에 한 줄 코드가있는 기능을 갖습니다.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}

뒤로 버튼의 텍스트를 동일한 텍스트로 변경하고 원래 왼쪽 화살표 모양을 유지하고 뒤로 버튼을 클릭 할 때 작업을 수행하려면 " CustomNavigationController "를 둘러 보는 것이 좋습니다. .


문제 : 탐색 모음의 "뒤로"텍스트를 바꿀 수 없습니다.

이유 : 상위보기 컨트롤러의 .title 속성이 nil (또는 초기화되지 않음)로 설정되어 있으므로보기를 푸시 한 후 탐색 표시 줄에 "뒤로"레이블이 설정되어 있습니다.

한 가지 해결책 : self.title = "Whatever ..."를 설정하면 새 뷰 컨트롤러를 누른 후 "뒤로"대신 "Whatever ..."가 나타납니다.

참고 URL : https://stackoverflow.com/questions/1449339/how-do-i-change-the-title-of-the-back-button-on-a-navigation-bar

반응형