"Nút quay lại" của a UINavigationController
theo mặc định hiển thị tiêu đề của chế độ xem cuối cùng trong ngăn xếp. Có cách nào để có văn bản tùy chỉnh trong nút quay lại thay thế?
"Nút quay lại" của a UINavigationController
theo mặc định hiển thị tiêu đề của chế độ xem cuối cùng trong ngăn xếp. Có cách nào để có văn bản tùy chỉnh trong nút quay lại thay thế?
Câu trả lời:
Từ liên kết này :
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
Như Tyler đã nói trong các ý kiến:
không làm điều này trong trình điều khiển chế độ xem hiển thị, nhưng trong trình điều khiển chế độ xem mà bạn sẽ thấy nếu bạn nhấn nút quay lại
release
sự UIBarButtonItem
.
UIBarButtonItemStyleBordered
bằng một cuộc gọi đến tài sản self.navigationItem.backBarButtonItem.style
. Tài liệu: developer.apple.com/l
Bạn có thể đặt văn bản trong Trình tạo giao diện:
Chọn mục điều hướng của ViewContoder mà nút quay lại sẽ trở về:
Trong trình kiểm tra thuộc tính bảng tiện ích, nhập nhãn của bạn cho Nút Quay lại:
Tôi thích cách tiếp cận này hơn là đặt tiêu đề trong mã như trong câu trả lời được chấp nhận.
Cũng lưu ý, bạn cần thực hiện việc này trong trình điều khiển xem một cấp lên ngăn xếp. Nói cách khác, không làm điều này trong trình điều khiển chế độ xem hiển thị, nhưng trong trình điều khiển chế độ xem mà bạn sẽ thấy nếu bạn nhấn nút quay lại.
-Tyler
Tôi sử dụng cái này:
// 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";
}
Tôi đã tìm thấy một giải pháp hữu ích cho việc này bằng cách chỉ cần đặt tiêu đề của bộ điều khiển trước khi đẩy một bộ điều khiển khác lên ngăn xếp, như thế này:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
Sau đó, đảm bảo đặt tiêu đề gốc viewWillAppear
, như thế này:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Điều này hoạt động vì hành vi mặc định UINavigationController
khi xây dựng nút quay lại trong hoạt động đẩy là sử dụng tiêu đề từ bộ điều khiển trước đó.
Tiêu đề của nút quay lại mặc định cho tiêu đề của chế độ xem trước, vì vậy một mẹo nhanh tôi sử dụng là đặt mã sau vào tệp .m của chế độ xem trước.
-(void)viewWillAppear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Original Title";
}
-(void)viewWillDisappear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Back";
}
trong phương thức init của bạn, thêm đoạn mã sau:
- (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;
}
sau đó thêm một phương thức đơn giản, để cho phép bỏ qua trình điều khiển khung nhìn:
-(void)goBack {
[self.navigationController popViewControllerAnimated:YES];
}
Thêm mã sau vào viewDidLoad hoặc loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
Tôi đã thử nghiệm nó trong iPhone và iPad với iOS 9
navigationController
và topItem
các thuộc tính, ví dụ:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Thêm vào câu trả lời của kiềm chế. Lưu ý từ các tài liệu của Apple rằng tuyên bố của backBarButtonItem là:
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem
Do đó, câu trả lời của kiềm chế sẽ rò rỉ bộ nhớ vì trình thiết lập tổng hợp sẽ retain
là trường hợp bạn vượt qua nó, điều này không bao giờ được phát hành rõ ràng. Bạn có thể khắc phục điều này bằng cách sử dụngautorelease
self.navigationItem.backBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStyleBordered
target:nil
action:nil] autorelease]; //<-- autoreleased
Hoặc bạn có thể trỏ một biến vào ví dụ để bạn có thể phát hành nó một cách rõ ràng sau:
UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];
Hi vọng điêu nay co ich!
Tôi đã khám phá ra một điều thú vị. Nếu bạn phân lớp UINavigationController
và ghi đè pushViewController:animated:
phương thức và làm một cái gì đó như thế này: (hãy nhớ rằng tôi đang sử dụng ARC)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle: @"Back"
style: UIBarButtonItemStyleBordered
target: nil action: nil];
viewController.navigationItem.backBarButtonItem = backButton;
[super pushViewController:viewController animated:animated];
Sau đó, đối với tất cả những ViewControllers
gì được đẩy bằng bộ điều khiển điều hướng của bạn sẽ có nút "Quay lại" trong đó. Nếu bạn muốn thay đổi văn bản cho các bộ điều khiển chế độ xem nhất định, bạn có thể thử và có thể chuyển trình điều khiển khung nhìn sang một lớp nhất định hoặc giao thức tùy chỉnh của riêng bạn (mà trình điều khiển khung nhìn của bạn thừa hưởng từ đó có thể có một phương thức như thế backButtonText
hoặc một thứ ngớ ngẩn như thế) có thể cung cấp cho bạn một số thông tin nhất định về trình điều khiển khung nhìn sắp có trong sothat, bạn có thể tùy chỉnh văn bản nút quay lại cho nó. Bây giờ văn bản nút quay lại được chăm sóc ở một nơi chỉ chịu trách nhiệm. Tôi phải thừa nhận rằng việc tạo một nút mới để thay đổi văn bản thật tệ, nhưng ồ.
Bất cứ ai cũng có thể nghĩ ra một lý do tại sao không làm điều đó như thế này? Ít nhất bạn không phải nghịch ngợm với các tiêu đề của trình điều khiển hoặc phải nhớ tạo một nút quay lại mới trước khi đẩy trình điều khiển chế độ xem trên bộ điều khiển điều hướng.
câu trả lời của kiềm chế hoạt động tốt.
Lưu ý rằng nếu bạn đẩy nhiều hơn một bộ điều khiển chế độ xem, tiêu đề nút quay lại đã thay đổi sẽ xuất hiện cho mỗi bộ điều khiển, có thể không phải là thứ bạn muốn.
Trong trường hợp đó, bạn sẽ cần tạo UIBarButtonItem tùy chỉnh mỗi khi bạn đẩy bộ điều khiển xem.
Ngoài ra, hãy chắc chắn rằng bạn làm điều đó trước khi đẩy bộ điều khiển xem, nếu không bạn sẽ bị trục trặc màn hình khi tiêu đề thay đổi.
Mở rộng theo đề xuất của Aubrey, bạn có thể thực hiện điều này trong trình điều khiển chế độ xem con:
tạo hai biến để lưu trữ các giá trị cũ của navigationItem.title của cha mẹ và navigationItem của cha mẹ
UINavigationItem* oldItem;
NSString* oldTitle;
trong viewDidLoad
, thêm vào như sau:
oldItem = self.navigationController.navigationBar.topItem;
oldTitle = oldItem.title;
[oldItem setTitle: @"Back"];
trong viewWillDisappear
, thêm vào như sau:
[oldItem setTitle: oldTitle];
oldTitle = nil; // do this if you have retained oldTitle
oldItem = nil; // do this if you have retained oldItem
Nó không hoàn hảo. Bạn sẽ thấy tiêu đề của chế độ xem cha thay đổi khi bộ điều khiển mới được kích hoạt. NHƯNG điều này không đạt được mục tiêu gắn nhãn tùy chỉnh nút quay lại và giữ cho nó có hình dạng như một nút quay lại tiêu chuẩn.
Đặt điều này vào bạn viewDidLoad
, hy vọng nó sẽ dẫn đến những gì bạn đang tìm kiếm
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
nếu bạn muốn đặt tiêu đề trong bộ điều khiển ARRIVING (đôi khi logic hơn ..) trong swift 3, hãy làm:
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
}
})
}
trong bộ điều khiển sắp tới:
override func viewDidLoad() {
super.viewDidLoad()
self.setBackButtonNavBar(title: "back", delay: 0.3)
}
thông thường tôi đặt self.setBackButtonNavBar trong phần mở rộng của bộ điều khiển.
Tôi biết đây là một câu hỏi cũ và loại câu trả lời đã được cập nhật!
Cách dễ dàng là làm điều này trong cha mẹ ViewContoder:
tức là cái đưa bạn đến bộ điều khiển xem tiếp theo.
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
Làm điều này trong mã loại bỏ kiểu nút quay lại của UINavigationConroller
. Nếu bạn thêm một Mục điều hướng trong mỗi chế độ xem của mình, bạn có thể đặt tiêu đề của trang sau trở lại trong StoryBoard
.
self.navigationController.navigationBar.topItem.title = @"Custom text";