Nút quay lại UINavestionControll


147

"Nút quay lại" của a UINavigationControllertheo 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ế?


1
Công việc này đối với tôiself.navigationController.navigationBar.topItem.title = @"Custom text";
huync

Câu trả lời:


342

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


4
Bạn nên releasesự UIBarButtonItem.
Mehrdad Afshari

217
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

6
Chỉ để làm rõ nhận xét của Tyler vì lúc đầu tôi không hiểu điều này: Đặt backBarButtonItem trong điều khiển chế độ xem điều hướng. Nó đang cài đặt nút sẽ hiển thị để BACK cho trình điều khiển chế độ xem này. Cũng lưu ý rằng mặc dù không có kiểu nút cho nút mũi tên, nút này sẽ vẫn có kiểu mũi tên. Tôi đã sử dụng UIBarButtonItemStylePlain và vẫn nhận được kiểu nút mũi tên.
Jon Steinmetz

3
Gợi ý: Thay vì giả định kiểu, hãy chuyển kiểu hiện đang đặt. Trong mã câu trả lời này, thay thế UIBarButtonItemStyleBorderedbằng một cuộc gọi đến tài sản self.navigationItem.backBarButtonItem.style. Tài liệu: developer.apple.com/l
Library / ios /

1
Lưu ý rằng trong ARC bạn phải bỏ cuộc gọi tự động thoát. vì vậy bạn có self.navlationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @ "Tiêu đề tùy chỉnh": UIBarButtonItemStyleBordered target: nil action: nil];
bkbeachlabs

43

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ề:

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

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


Đây là câu trả lời tốt nhất tôi tìm thấy cho đến nay.
Ayan Sengupta

2
Để rõ ràng, điều này cần phải được đặt trên Mục điều hướng của trình điều khiển chế độ xem, chứ không phải trên chính trình kiểm tra thuộc tính của trình điều khiển chế độ xem.
Patrick Đọc

Đây là câu trả lời tốt nhất tôi tìm thấy.
bicepjai

Đây là câu trả lời hay nhất
Alex Brown

2
Kể từ Xcode 6.1.1 và đang chạy trong iOS 7, có vẻ như tiêu đề xem trước đó của bạn sẽ VẪN ghi đè lên bất kỳ tiêu đề nút quay lại nào bạn đặt ở đây. Nếu tiêu đề của chế độ xem trước chứa nhiều hơn giới hạn 11 ký tự, thì nút quay lại của chế độ xem tiếp theo sẽ chỉ đơn giản là "Quay lại". Không có cách nào khác ngoài việc tạo ra một mục thanh điều hướng mới từ đầu như thể hiện trong câu trả lời được bình chọn hàng đầu ở đây.
tia

22

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";
}

Điều này gần như hoạt động với tôi, nhưng khi tôi nhấp vào nút quay lại, văn bản sẽ thay đổi thành tiêu đề của phụ huynh trong suốt thời gian của hoạt hình :-(
Danny Tuppeny

3
Điều này thay đổi tiêu đề nút Quay lại của bộ điều khiển trong ngăn xếp. Nó không thay đổi tiêu đề nút Quay lại của bộ điều khiển hiện đang hiển thị. Tệ hơn nữa: nó thay đổi tiêu đề của bộ điều khiển trước đó thành bộ điều khiển trước đó!
leviathan

Theo ghi nhận của các nhà bình luận khác, phương pháp này là một chút không thể bảo vệ. Tôi không khuyên bạn nên làm điều này vì nó không thực sự là cách API muốn bạn sử dụng nó. Bạn có thể tự đặt ra những lỗi khó khăn trong tương lai!
RickDT

11

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 UINavigationControllerkhi 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 đó.


1
Vấn đề với điều này là tiêu đề thay đổi trên chế độ xem cũ khi nó hoạt hình và trông hơi khó hiểu. Không có giải pháp nào được đưa ra ở đây dường như hoạt động như bạn muốn :-(
Danny Tuppeny

1
Điều này là hoàn hảo trong tình huống của tôi vì tôi không hiển thị NavBar trên màn hình trước đó và tôi chỉ muốn xóa tiêu đề Nhãn khỏi nút quay lại trên màn hình mới và chỉ có mũi tên chevron iOS7. Do đó, tôi chỉ có thể đặt một NSString trống cho tiêu đề.
siburb

bộ điều khiển chế độ xem nâng cao ngoại lệ khi chạm vào lưng
Sumit

7

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";
}

Điều này hoạt động khá tốt đối với nhiều trường hợp và nó khá đơn giản ... chỉ quan sát là việc ghi đè một trong hai phương thức này đòi hỏi việc triển khai siêu của một số điểm trong phương thức mới.
izk

2
Với phương pháp này, người ta sẽ thấy tiêu đề của chế độ xem chính được thay đổi thành 'Quay lại' trước khi hoạt ảnh đẩy xảy ra. (Và, thật tuyệt vời, nếu bạn chuyển nó sang phương thức viewDidDisappear, bạn sẽ thấy công tắc xảy ra sau khi đẩy ..)
James Boutcher

Tôi thích phương pháp này nhưng vấn đề tôi gặp phải là "Tiêu đề gốc" được đặt ổn định nhưng nó đi kèm với dấu chấm lửng nếu nó dài hơn "Quay lại", bởi vì chế độ xem chưa nằm trong phân cấp chế độ xem , nó không chuyển tiếp chế độ xem tiêu đề. Vấn đề được mô tả bởi @JamesBoutcher ở trên là không thể nhận thấy đối với tôi do tốc độ ban đầu nhanh của hình ảnh động. Trên thực tế, tôi chỉ nhận ra rằng vấn đề tôi gặp phải đặc biệt đáng chú ý do hoạt hình kết thúc chậm, đó là khi vấn đề này nổi bật.
trss

Mặc dù câu trả lời tại stackoverflow.com/questions/1441699/ cảm thấy muốn tùy biến nhiều hơn mức cần thiết, đó là cách ghi lại tài liệu và quan trọng hơn là dường như phù hợp hơn với ý định của chúng tôi.
trss

6

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];  
}

3

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


Nên là self.navestionControll? .NavestionBar.backItem? .Title = "Văn bản tùy chỉnh"
Peacemoon

1
sự khác biệt duy nhất tôi cần là chuỗi tùy chọn trên navigationControllertopItemcác thuộc tính, ví dụ:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel

2

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ẽ retainlà 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!


Lưu ý những ngày này, với ARC, bạn không cần phải lo lắng về việc tự động chạy (và thực sự trình biên dịch sẽ bị lỗi nếu bạn cố gắng tự động chạy lại trong một dự án hỗ trợ 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

Tôi đã khám phá ra một điều thú vị. Nếu bạn phân lớp UINavigationControllervà 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 ViewControllersgì đượ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ế backButtonTexthoặ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.


0

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.


0

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.


0

Đặ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];

0

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.


0

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)

-1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.