답변:
"NewTitle"이라는 제목의 ViewController를 호출하는 메소드에 배치해야합니다. push 또는 popViewController 문 바로 앞에 있습니다.
UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"NewTitle"
style:UIBarButtonItemStyleBordered
target:nil
action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
-viewDidLoad:
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의 답변에서 나온 것입니다.
self.navigationController?.navigationBar.topItem?.backBarButtonItem
자, 여기 방법이 있습니다. 뷰 컨트롤러가 "첫 번째"이고 버튼 등을 눌러 다른 뷰 컨트롤러를 "두 번째"탐색하는 경우 몇 가지 작업을 수행해야합니다. 먼저 다음과 같이 "두 번째"보기 컨트롤러의 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];
}
그게 다야.
leftBarButtonItem
의 모양은 없습니다 backBarButtonItem
.
제목이 정말 긴 부모 뷰 컨트롤러가있었습니다. 이로 인해 뒤로보기 텍스트가 하위 뷰 컨트롤러의 제목으로 번져 나옵니다.
여러 가지 솔루션을 시도한 후에 이것이 내가 한 일입니다 (@ john.k.doe 접근 방식으로 확장).
Xcode 7.2, Swift 2 사용
Navigation Item
에서 Parent View Controller 장면 (자식 VC 아님) 에 a 를 추가합니다Attributes Inspector
새의 Navigation Item
, A의 입력 space
의 문자 Back Button
필드. 이것에 대해서는 나중에 더 설명하겠습니다.단편:
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
쉽습니다.
다른 방법이 있습니다.
부모보기 컨트롤러에서 다음 방법을 구현하십시오.
- (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;
}
나는 이것이 이것을 달성하는 훨씬 더 우아한 방법이라고 생각합니다.
이 코드를 한 곳에 배치하면 필요할 때 자동으로 채워집니다.
각 푸시 요청 전에 코드를 호출 할 필요가 없습니다.
도움이 되었기를 바랍니다
답은 다음과 같습니다.
에서 viewDidAppear:animated
(not in viewDidLoad
) 다음을 수행하십시오.
- (void)viewDidAppear:(BOOL)animated
{
[self.navigationController.navigationBar.backItem setTitle:@"anything"];
// then call the super
[super viewDidAppear:animated];
}
뒤로 버튼의 모양을 유지하려면
여기에 설명 된 해결책 중 어느 것도 나를 위해 일하지 않았습니다. 그래서 내가 한 것은 다음과 같은 방식으로 내가 온 장면에서 제목을 제거하는 것입니다.
self.title = @"";
따라서 새로운 장면이 표시되면 배경 텍스트가 나타나지 않습니다.
나는 이것이 절대적인 해결책이 아니라는 점에 동의하지만, 효과가 있었고 설명 된 것도 나를 위해 일하지 않았다.
back button의 이름을 변경하는 가장 쉬운 방법은 view controllers 제목을 back button의 제목으로 설정 한 다음 view controllers 탐색 항목의 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];
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
대부분의 솔루션은 원하는 제목의 일반적인 버튼을 추가하면서 원래 스타일의 BackButton (왼쪽 화살표 막대 버튼)을 제거합니다.
따라서 원래 스타일을 유지하려면 다음 두 가지 방법이 있습니다.
첫째 : 문서화되지 않은 버튼 스타일 (110 또는 이와 유사한 것)을 사용하고 싶지 않습니다. 그러나 원하는 경우 여기에서 방법을 찾을 수 있습니다.
두 번째 : 나는 Trenskow의 아이디어를 사용합니다. 나는 그것을 좋아하고 조금 바꿨다.
-(NSString *) title을 재정의하는 대신 원래 제목을 다음과 같은 방식으로 유지하기로 결정했습니다.
- (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 ..."가 나타납니다.