Nút quay lại tùy chỉnh UINavestionBar không có tiêu đề


231

Làm cách nào tôi có thể tùy chỉnh nút điều hướng quay lại trong iOS 7 trở lên mà không có tiêu đề? (tức là chỉ với mũi tên)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Tôi chỉ tự hỏi nếu họ có bất kỳ self.backButtonItem;

HOẶC LÀ

một cái gì đó như thế này?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
Bạn có thể sử dụng @hiroshi answer + thanh điều hướng thuộc tính tintColor để tạo chevron với màu tùy chỉnh và không có bất kỳ tiêu đề nào
Dmitry Zhukov

Đối với những người có thanh tab và bạn không muốn có văn bản của nút quay lại, cách khắc phục là: trong viewDidLoad () của TabBarContoder
Borzh

Câu trả lời:


313

Nó thực sự khá dễ dàng, đây là những gì tôi làm:

Mục tiêu C

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

Swift 2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

Swift 3

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Đặt dòng này trong bộ điều khiển khung nhìn đang đẩy vào ngăn xếp ( bộ điều khiển khung nhìn trước đó ). Nút quay lại của trình điều khiển xem mới được ấn bây giờ sẽ hiển thị bất cứ thứ gì bạn đặt cho initWithTitle, trong trường hợp này là một chuỗi rỗng.


3
Tôi đã sử dụng nhưng tiêu đề đến và biến mất trong một thời trang hoạt hình ??
user1010819

7
Cảm ơn Kyle! Tôi đã tìm cách đổi tên nút quay lại mặc định trong iOS 7. Tôi đặt cái này trong prepareForSeguebộ điều khiển xem và nó hoạt động hoàn hảo.
yiwei

1
@ user1010819 Đây là hành vi dự kiến, barButtonItems sẽ hoạt hình vào và ra khi chuyển đổi bộ điều khiển xem. Bạn đang cố gắng để thực hiện?
Kyle Begeman

1
@YiweiGao Không có vấn đề! Nó chỉ là một trong những điều mà nếu bạn biết mã đúng, nó khá đơn giản! Tôi vui vì nó đã giúp!
Kyle Begeman

3
Tôi cảm thấy như điều này cần một bản cập nhật, nó chỉ hiển thị không có gì ngay bây giờ, mũi tên không có mặc định?
Mathijs Segers

198

Tôi tìm thấy một cách dễ dàng để tạo nút quay lại bằng mũi tên đơn iOS.

Hãy giả sử rằng bạn có bộ điều khiển điều hướng đến ViewA từ ViewB. Trong IB, chọn thanh điều hướng của ViewA, bạn sẽ thấy các tùy chọn sau: Tiêu đề, Nhắc và Nút Quay lại.

Tùy chọn thanh điều hướng ViewA

Tùy chọn thanh điều hướng ViewA

Bí quyết là chọn tiêu đề nút quay lại bộ điều khiển xem định mệnh (ViewB) trong các tùy chọn của bộ điều khiển chế độ xem trước đó (Xem A). Nếu bạn không điền tùy chọn "Nút quay lại", iOS sẽ tự động đặt tiêu đề "Quay lại", với tiêu đề của trình điều khiển chế độ xem trước đó . Vì vậy, bạn cần điền vào tùy chọn này với một khoảng trống.

Điền vào chỗ trống trong tùy chọn "Nút quay lại"

Điền vào chỗ trống trong tùy chọn "Nút quay lại"

Kết quả:

Kết quả:


Chào mừng bạn đến với Stack Overflow . Nếu bạn chưa có, hãy xem những gì chúng tôi tham quan và đọc một số bài viết trong trung tâm trợ giúp về cách chúng tôi làm việc và một số phong tục cộng đồng ở đây. Nếu bạn cần bất kỳ trợ giúp nào với các chức năng của trang web, đừng ngại tìm kiếm, sau đó đặt câu hỏi về Meta Stack Overflow (nếu bạn vẫn không thể tìm thấy câu trả lời). Cảm ơn và chúc may mắn! Dù sao, bạn có thể đăng hình ảnh của mình ngay bây giờ ... :)
Qantas 94 Nặng

53
nó hoạt động, chỉ cần chú ý - bạn cần đặt "Nút quay lại" cho bộ điều khiển trước đó (ví dụ: rootViewContoder trong bộ điều khiển điều hướng của bạn)
evfemist 17/214

Hãy chắc chắn rằng bạn không có "hidesBackButton" thiết lập để TRUE vào mục menu trong ViewA
shim

Tôi thấy rằng điều này hoạt động nếu tiêu đề của trình điều khiển trình bày đủ dài - nếu đó là một tiêu đề ngắn thì nó sẽ được sử dụng thay thế.
amergin

1
đối với tôi nó chỉ hoạt động khi cả NavigationItem của nguồn và đích của ViewContoder đã Back Buttonđược đặt thành một ký tự không gian duy nhất (tức là cả ViewA và ViewB)
dcestari

72

Chỉ cần sử dụng một hình ảnh!

OBJ-C :

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

Chuyển 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Biểu tượng-Back.png

Biểu tượng trở lại

Biểu tượng -Back@2x.png

Biểu tượng trở lại @ 2x

Biểu tượng -Back@3x.png

Biểu tượng trở lại @ 23x


4
Với giải pháp này, bạn dường như mất đi chức năng "vuốt để quay lại".
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfthực hiện mẹo để giữ cử chỉ vuốt ngược lại
Victor Carmouze

Tôi đã tìm kiếm câu trả lời này, có lẽ trong suốt cuộc đời tôi, cụ thể là bộ chọn hành động.
Des

29

iOS7 có các quy tắc giao diện mới, vì vậy tốt nhất là giữ ít nhất mũi tên lùi khi bạn đẩy UIView. Rất dễ dàng để thay đổi văn bản "trở lại" theo chương trình. Chỉ cần thêm mã này trước khi đẩy chế độ xem (Hoặc chuẩn bịForSegue nếu bạn đang sử dụng StoryBoards):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

Điều này sẽ thay đổi văn bản "Quay lại" mặc định, nhưng sẽ giữ mũi tên lùi theo kiểu iOS7. Bạn cũng có thể thay đổi màu sắc cho mũi tên lùi trước khi đẩy chế độ xem:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

Hy vọng điều này sẽ giúp bạn!


2
Điều này hoạt động thực sự tốt và có vẻ tốt hơn so với các tùy chọn khác. Chẳng hạn, tiêu đề không bao giờ cần phải được đặt lại về giá trị trước đó, không giống như một số câu trả lời khác.
pr1001

26

Không có gì nhiều bạn cần phải làm. Bạn có thể đạt được điều tương tự thông qua bảng phân cảnh.

Chỉ cần đi bộ điều khiển điều hướng gốc và cung cấp một không gian. Hãy nhớ không phải bộ điều khiển bạn muốn nút quay lại không có tiêu đề, mà là bộ điều khiển điều hướng gốc.

Theo hình ảnh dưới đây.  Điều này hoạt động cho iOS 7 và iOS 8


Tôi đã thử nó, nó hoạt động. Nhưng tôi vẫn không thể thay đổi tiêu đề trong mã.
Yu-Lin Wang

Đã hoạt động với XCode7, nhưng không hoạt động nữa trong xCode8 -> ios10.X, tôi đã sử dụng phương pháp
@iwasrobbed

Tất cả thiên tài đều đơn giản!
Illya Krit

22

Mặc dù câu trả lời của Kyle Begeman hoàn toàn có mẹo, nhưng thật khó chịu khi có mã này trong mọi trình điều khiển chế độ xem có thể. Tôi đã kết thúc với một UINavigationItemthể loại đơn giản . Coi chừng, ở đây là rồng! Xin lỗi, ý tôi là, sưng lên:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
Tôi đã nâng cấp nhưng sau đó quyết định sử dụng một hack đơn giản hơn - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( nguồn ) - có thể kém thanh lịch hơn một chút, nhưng cảm giác như bị
thổi phồng

2
Nghiêm túc đấy ... đừng vượt qua bất kỳ giải pháp nào khác. Triển khai giải pháp @nicky được đăng dưới dạng Danh mục và đừng suy nghĩ kỹ. Đây là một giải pháp tái sử dụng tuyệt vời có thể triển khai ứng dụng rộng rãi nếu bạn thêm tệp Prefix.pch này. Apple khuyến khích sử dụng các danh mục để thêm Phương thức vào các Lớp hiện có, bạn nên tận dụng lợi thế này khi có thể.
zmonteca 10/03/2015

Đây là giải pháp tốt nhất theo quan điểm của tôi, dù sao thì "phương thức_exchangeImcellenceation" là một chút không an toàn, hãy xem điều này: Đúng cách để làm phồng và hướng dẫn thay đổi NSHipster
Alessandro Orrù

@ AlessandroOrrù Trong trường hợp cụ thể này, điều này sẽ an toàn vì phương pháp bị xáo trộn là phương pháp UINavigationItemrất riêng, không có sự kế thừa liên quan. Và _cmdrất khó có thể tham gia vào một getter. Dù sao, đó là một điểm tốt. Vì vậy, nếu bạn có bất kỳ người trợ giúp nào trong số những người trợ giúp trong dự án của bạn, hãy đảm bảo bạn cũng sử dụng nó ở đây.
secondcitysaint

21

EDIT: 2014-04-09: Khi tôi đạt được danh tiếng, tôi cảm thấy tiếc vì tôi không sử dụng thủ thuật này nữa. Tôi đề nghị câu trả lời của Kyle. Cũng thông báo rằng selfcác self.navigationItem.backBarButtonItemkhông phải là điều khiển xem nút quay lại được hiển thị, nhưng bộ điều khiển xem trước để được quay trở lại.

Nếu bạn không cần phải có văn bản tiêu đề cho trình điều khiển chế độ xem trước đó, chỉ cần điền tiêu đề bằng một chuỗi trống;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

Điều này sẽ ngăn hiển thị "trở lại" với chevron trên bộ điều khiển xem đẩy.

EDIT: Ngay cả khi bạn sử dụng văn bản tiêu đề không trống, đặt tiêu đề của trình điều khiển chế độ xem trước đó trong viewWillAppear:các tác phẩm ngoại trừ tiêu đề có thể nhấp nháy trong nháy mắt khi trình điều khiển chế độ xem xuất hiện. Tôi nghĩ rằng "Ứng dụng twitter" dường như thực hiện hack tinh tế hơn để tránh nhấp nháy.


Vấn đề duy nhất tôi gặp ở đây là khi tôi nhấn thanh điều hướng để quay lại tiêu đề trên chế độ xem trước đó trở nên trống rỗng. Có cách nào khác không?
Alioo

@Alioo Bạn đã thử những gì tôi đã đề cập trong dòng "EDIT" chưa?
hiroshi

20

Điều này hoạt động, nhưng nó sẽ xóa tiêu đề của mục trước đó, ngay cả khi bạn bật lại nó:

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

Chỉ cần đặt thuộc tính này trên viewDidLoadBộ điều khiển Xem đẩy.


17
Điều này sẽ xóa tiêu đề của mục trước đó, ngay cả khi bạn bật lại nó. Không tốt lắm :(
Antzi

Tôi đặt tiêu đề của VC đẩy viewWillAppearđể nó luôn được đặt đúng.
Guto Araujo

@GutoAraujo Nó hoạt động nhưng tiêu đề xuất hiện lại với phù thủy trì hoãn 1 hoặc 2 giây khiến UX không tốt.
fuiiii

Trong xCode8 -> ios10.X đây dường như là cách duy nhất để giải quyết vấn đề
LucioB

12

Đây là cách tôi làm và cách đơn giản nhất, hiệu quả và rõ ràng nhất để làm điều đó.

Điều này hoạt động nếu nhúng vào Navigation Controller

Swift 3

Trong viewDidLoadTôi thêm phần này vào Trình điều khiển xem, bạn muốn nút quay lại chỉ là mũi tên.

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

Sự khác biệt của câu trả lời này với câu trả lời của @Kyle Begeman là bạn gọi điều này trên trình điều khiển chế độ xem mà bạn muốn nút quay lại chỉ là mũi tên, không phải trên trình điều khiển xem ngăn xếp đẩy.


7

Bạn không có quyền truy cập vào backButtonItem theo cách bạn muốn, bạn cần tạo nút quay lại của riêng mình như bên dưới:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

Và tất nhiên:

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

sau đó chúng tôi mất hình ảnh động mờ dần đẹp mắt xảy ra ở nút quay lại
Kiddo

3
Bạn cần một mặt nạ để chuyển tiếp trơn tru. "* Nếu bạn muốn sử dụng một hình ảnh tùy chỉnh để thay thế cho chevron mặc định, bạn cũng cần tạo một hình ảnh mặt nạ tùy chỉnh. IOS 7 sử dụng mặt nạ để làm cho tiêu đề của màn hình trước đó xuất hiện từ ba hoặc biến thành chevron trong khi điều hướng chuyển tiếp. "
người dùng

3
@null bạn sẽ mất cử chỉ vuốt sang bên của iOS 7!
Mazen Kasser

@user Tôi nhận được hình ảnh tùy chỉnh nhưng màu sắc mặc định là màu xanh. Làm thế nào tôi có thể không thêm tint? cảm ơn
Mazen Kasser

7

Mục tiêu: tùy chỉnh tất cả nút quay lạiUINavigationBarthành biểu tượng màu trắng

Các bước: 1. trong phương thức "didFinishLaunchingWithOptions" của AppDelete

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2.trong viewDidLoadphương thức của siêu ViewControllerhạng phổ biến :

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

Điều này cho thấy cảnh báo "Phiên bản ngầm định của HỆ THỐNG_VESION _..." không hợp lệ trong C99.
Jayprakash Dubey

7

Chuyển 4

Đối với những người muốn tạo nút quay lại tùy chỉnh cũng như xóa tiêu đề của họ, vui lòng sử dụng đoạn mã sau trong trình điều khiển chế độ xem đang đẩy nút mới:

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Để sử dụng phổ quát hơn, hãy làm như sau:

  1. Tạo một chức năng phổ quát như sau:

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. Sau đó sử dụng nó trong bộ điều khiển xem như sau:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

Cách hack đơn giản từ iOS6 cũng hoạt động trên iOS7:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

Chỉnh sửa: Đừng sử dụng hack này. Xem bình luận để biết chi tiết.


6
Đừng sử dụng bản hack này. Có một lỗi trong mã của Apple trên các thiết bị 64 bit sẽ ngăn chế độ xem theo chế độ xuất hiện khi bạn thực hiện bù tiêu đề nút thanh. Thêm chi tiết .
zh.

Vâng, chỉ có vấn đề trên thiết bị, không phải giả lập.
zh.

Bản hack này không còn hoạt động khi được xây dựng với Xcode 9 / iOS 11. "<" sẽ xuất hiện quá thấp và bạn sẽ thấy các ràng buộc bị hỏng khi chạy trong trình gỡ lỗi.
T'Pol

3

bạn có thể sử dụng cái này Điều này hoạt động hoàn hảo đối với tôi bằng cách chỉ cần thêm UIButtonmột quyền giám sát choUIBarButtonItem .

Hãy thử mã dưới đây

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}

3
tuy nhiên, điều này sẽ vô hiệu hóa cử chỉ vuốt ngược trong iOS 7
user102008 15/03/2016

3

Tạo một UILabeltiêu đề bạn muốn cho bộ điều khiển xem gốc của bạn và gán nó cho bộ điều khiển xem navigationItem.titleView.

Bây giờ đặt tiêu đề thành một chuỗi trống và bộ điều khiển xem tiếp theo bạn đẩy sẽ có nút quay lại không có văn bản.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}

3

Tất cả các câu trả lời không giải quyết vấn đề. Không thể chấp nhận đặt tiêu đề nút quay lại trong mọi trình điều khiển chế độ xem và thêm phần bù vào tiêu đề vẫn làm cho tiêu đề Chế độ xem tiếp theo chuyển sang phải.

Đây là phương pháp sử dụng phương thức swizzling, chỉ cần tạo phần mở rộng mới cho UINavlationItem

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}

Đặt nút quay lại từ trở lại, hoạt động rất tốt: self.navlationItem.backBarButtonItem.title = @ "Back";
Mike Zriel

Bạn có ý nghĩa gì bạn đời? Câu hỏi là về việc loại bỏ văn bản từ nút quay lại?
jakub wolanski

1
Rất nhiều Ứng dụng và Ứng dụng riêng của Apple nói "<Quay lại", vì vậy thật tốt khi tuân thủ tiêu chuẩn. BigTakeAway và JustEat.
Mike Zriel

2

Tôi đã áp dụng mã sau trong viewDidLoad và nó hoạt động:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

Chỉ cần cập nhật tôi sử dụng Biểu tượng Vector


2

Bạn có thể phân lớp UINavestionControll, đặt chính nó làm đại biểu và đặt backBarButtonItem trong phương thức ủy nhiệm navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

2

Đặt lại tiêu đề trống

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

Thay đổi hình ảnh trở lại

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

Tôi đã sử dụng giải pháp này từ iOS 5 trở lên mà không gặp vấn đề gì. Tôi đã thực hiện một chức năng tiện ích mà tôi gọi trong bộ điều khiển xem của tôi. Bạn cần phải làm điều đó trong viewDidLoad hoặc bất kỳ điểm nào sau đó.

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

Trong một số trường hợp, mục điều hướng có thể đã tồn tại, trong các trường hợp khác, nó cần được tạo. Điều này chiếm cả hai trường hợp mà không gây rối với tiêu đề mục điều hướng. Nó cho phép bạn loại bỏ tiêu đề bằng cách chỉ cần đi vào @"".


1
Đây là câu trả lời chính xác. Không bịp bợm. Đây chỉ là sử dụng API iOS theo cách nó được sử dụng để đặt tiêu đề. Đặt nó thành @ "" để xóa tiêu đề (đã được kiểm tra và hoạt động tốt).
n13

1

Cách duy nhất làm việc cho tôi là:

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

CẬP NHẬT:

Khi tôi thay đổi cờ hoạt hình segue thành true (Đó là sai trước đó), cách duy nhất phù hợp với tôi là:

navigationController?.navigationBar.topItem?.title = ""

1

Nếu bạn có hai Trình điều khiển ViewContaptor (FirstVC, SecondVC) trong Bộ điều khiển Điều hướng và bạn muốn chỉ có mũi tên lùi trong SecondVC.

Bạn có thể thử điều này trong ViewDidLoad của FirstVC

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

Sau đó, khi bạn đẩy vào SecondVC, bạn sẽ thấy chỉ có mũi tên lùi


1

Nếu bạn đặt tintColor Of NavigationBar, hãy thêm hình ảnh nút quay lại tùy chỉnh mà không có tiêu đề mà màu sắc sẽ phản ánh màu hình ảnh. Vui lòng theo liên kết táo documentaion này.

https://developer.apple.com/lvern/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_Vf/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];


1

Tôi đã viết một phần mở rộng để làm cho điều này dễ dàng hơn:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}

1

Bạn có thể thay đổi tiêu đề thành @ "" của ViewContoder hiện tại trên viewWillDisappear và khi nó sắp hiển thị lại, hãy đặt lại tiêu đề thành bất cứ điều gì trước đây.

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

Trong phương thức readyForSegue: của ViewContoder đầu tiên của bạn, bạn đặt tiêu đề lượt xem đó thành @ "", vì vậy khi chế độ xem tiếp theo được đẩy, nó sẽ hiển thị tiêu đề ViewContoder trước đó sẽ là @ "".

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

Vấn đề duy nhất với điều này là khi bạn nhấn nút quay lại, chế độ xem trước đó của bạn sẽ không có tiêu đề, vì vậy bạn có thể thêm lại nó vào viewWillAppear:

-(void)viewWillAppear:(BOOL)animated{
   self.navigationItem.title = @"First View Title";
}

Tôi không thích giải pháp này lắm nhưng nó hiệu quả và tôi không tìm ra cách nào khác để thực hiện.


Xem câu trả lời của tôi cho giải pháp chính xác mà không gây rối với tiêu đề mục điều hướng.
Dima

Giải pháp của bạn có giữ mũi tên lùi của iOS7 không? Tôi đã thử một cái gì đó tương tự nhưng nó đã loại bỏ mũi tên.
Alejandro Figueroa

Nó giữ mũi tên quay lại trong iOS 7, vâng. Mặc dù vậy, trong iOS 6, một chuỗi trống (0 độ dài) cũng sẽ loại bỏ hoàn toàn nút này, do đó, việc này chỉ thực sự tốt cho iOS 7.
Dima

Có một giải pháp rất đơn giản. Xem nếu câu trả lời của tôi làm việc cho bạn.
Guto Araujo

0

Để thêm vào câu trả lời của Thomas C ở trên, đôi khi việc đặt một khoảng trắng không hoạt động và bạn phải tiếp tục thêm khoảng trắng.

nút thanh trống

Bạn sẽ biết bạn đã thành công khi bạn thấy "Mục nút thanh -" trong "Mục điều hướng". Đó là trong Đề cương tài liệu (Trình chỉnh sửa-> Hiển thị phác thảo tài liệu). Khi bạn nhìn thấy hình ảnh trên, bạn có thể xóa một vài khoảng trắng và xem nếu nó vẫn hoạt động.


0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

Giống như Kyle Begeman, bạn thêm mã ở trên vào trình điều khiển xem gốc của bạn. Tất cả các bộ điều khiển xem phụ sẽ được áp dụng. Ngoài ra, thêm phương thức này vào initWithCoder: phương thức, bạn có thể áp dụng kiểu cho bộ điều khiển xem gốc trong các cách tiếp cận dựa trên xib, cốt truyện hoặc mã.

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.