Câu hỏi Nút quay lại tùy chỉnh trên thanh điều hướng


Trong ứng dụng của tôi có rất nhiều UIViewControllers với UINavigationControllers. Phải có nút "quay lại" và "nhà" UIButton trên UINavigationBar. Tất cả điều này hoạt động tốt.

Nhưng một số của tôi UIViewControllers có tên dài, và đôi khi có quá ít chỗ để lại cho nó. Tôi đang cố gắng thay thế nhãn gốc của nút "quay lại" (nó hiển thị tiêu đề của chế độ xem trước đó) với tùy chỉnh "Quay lại", nhưng bất kỳ điều gì tôi đã thử không hoạt động:

// Title didn't change
[self.navigationItem.backBarButtonItem setTitle:@"Back"];

// Action didn't set, no response from button ( button didn't do anything )
[self.navigationItem.leftBarButtonItem
   setAction:self.navigationItem.backBarButtonItem.action];

Và tôi cần nút "quay lại" để có một kiểu như trong câu hỏi này: Vẽ nút Quay lại tùy chỉnh trên Thanh điều hướng iPhone


8
2017-11-22 03:21


gốc


Câu trả lời được cung cấp trong câu hỏi mà bạn tham chiếu chưa đủ? - eric.mitchell
Nó đặt (= thay đổi) tiêu đề của chế độ xem trước đó - SentineL
có thể trùng lặp Cách thay đổi tiêu đề của nút quay lại UINavigationBar thành "Quay lại" - jrturton
không phải vậy. giải pháp đó đã không lưu hình dạng của nút - SentineL
trước khi iOS 7 không có API chính thức để làm những gì bạn muốn. Không chắc chắn về iOS 7. - nielsbot


Các câu trả lời:


Thử cái này

UIBarButtonItem *backBarBtnItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(popViewController)];
[self.navigationItem setBackBarButtonItem:backBarBtnItem];

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

6
2017-11-22 06:40



điều đó không hiệu quả. Tôi có thể xóa nút quay lại bình thường và thêm nút của riêng tôi, nhưng làm thế nào để làm cho hình dạng của nó giống như bình thường? - SentineL
cho rằng bạn cần phải thêm nút tùy chỉnh có hình ảnh mà tôi đoán ... [[UIBarButtonItem alloc] initWithCustomView: customButton]; - mihir mehta
đó là một đoạn mã man rợ nhỏ, nhưng tôi đoán, không có giải pháp khác ... Vì vậy, chúng ta hãy là một kẻ man rợ trong một thời gian :) Cảm ơn bạn đã phản hồi. - SentineL


Hãy thử những điều sau đây. Nó chắc chắn sẽ hoạt động:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *buttonImage = [UIImage imageNamed:@"back.png"];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:buttonImage forState:UIControlStateNormal];
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
    [customBarItem release];
}

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

Hãy chắc chắn rằng bạn có một hình ảnh nút với kích thước của một thanh điều hướng trở lại nút trong thư mục tài nguyên của bạn với tên back.png.

Cảm thấy tự do nếu cần bất kỳ sự trợ giúp nào khác.


50
2017-11-22 07:05



Tôi thấy rằng bạn có thể làm cho nút quay lại tùy chỉnh không thể phân biệt được từ nút quay lại iOS cổ phần bằng cách đặt hình ảnh cho trạng thái được đánh dấu, như sau: [button setImage: highlightedButtonImage forState: UIControlStateHighlighted]; - Omri Gazitt
tại sao tôi không thể thêm tiêu đề vào nút quay lại tùy chỉnh của mình bằng mã này? [button setTitle:@"Back" forState:UIControlStateNormal]; - ArVan
Thanh điều hướng có nút loại UIBarButton.You có thể tạo các mục UIBarButton với nội dung tùy chỉnh hoặc tạo các mục hệ thống tiêu chuẩn tùy thuộc vào nhu cầu của bạn. - Anil Kothari
Thực ra tôi đang sử dụng mã của bạn ở trên và có dòng này [button setImage:buttonImage forState:UIControlStateNormal]; Tôi nghĩ rằng tôi có thể thêm [button setTitle:@"Back" forState:UIControlStateNormal]; ngay sau đó, và điều đó sẽ hiệu quả, nhưng nó không ... - ArVan
Vấn đề với cách tiếp cận này là bạn không tùy chỉnh nút quay lại, thay vào đó bạn đang thêm một "leftBarButtonItem" mà không phải là điều tương tự. - quickthyme


Mục tiêu:


7
2018-02-24 10:20





Nếu bạn đang làm điều này trên khắp nơi như tôi, bạn nên thực hiện giải pháp của Anil như một danh mục:

@interface UIViewController (CustomBackButton)

- (void) setCustomBackButton;
- (void) back;

@end

@implementation UIViewController (CustomBackButton)

- (void) setCustomBackButton
{
    UIImage *buttonImage = [UIImage imageNamed:@"back.png"];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:buttonImage forState:UIControlStateNormal];
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
}

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

@end

2
2017-10-19 18:08





Đơn giản hơn:

UIBarButtonItem *barBtnItem = 
  [[UIBarButtonItem alloc]initWithTitle:@"Indietro"
                                  style:UIBarButtonItemStyleBordered
                                 target:self
                                 action:@selector(pop)];
[barBtnItem setTintColor:[UIColor whiteColor]];
self.navigationItem.leftBarButtonItem = barBtnItem;

1
2018-02-06 00:21





Giả sử bạn có hai bộ điều khiển - Controller1 và Controller2. Controller2 được đẩy từ Controller1. Vì vậy, trước khi đẩy Controller2 trên navigationController từ Controller1

Controller2 *controller2 = [[[Controller2 alloc]  init]autorelease];
self.navigationItem.hidesBackButton = YES;   

Bây giờ, trong phương thức viewDidLoad: phương thức của Controller2, thêm đoạn mã sau

UIBarButtonItem *backBarButtonItem =[[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(goBackToAllPets:)]autorelease];
self.navigationItem.leftBarButtonItem = backBarButtonItem;

và trong phương thức backButtonClicked, bạn có thể thực hiện các kiểm tra bạn muốn.


0
2018-06-16 07:40