Xóa văn bản tiêu đề của UIBarButtonItem trên iOS


198

Điều tôi muốn làm là xóa văn bản khỏi nút 'Quay lại' của một UIBarButtonItem , chỉ để lại chữ màu xanh trên thanh điều hướng. Hãy nhớ rằng tôi đang phát triển cho iOS 7. Tôi đã thử một số phương pháp, bao gồm, nhưng không giới hạn ở:

Đây là phương pháp hình ảnh mà tôi không thích (hình ảnh nhìn không đúng chỗ):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

Một phương pháp khác tôi đã thử là phương pháp này đơn giản là không hoạt động (không có gì được hiển thị):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

Những gì tôi muốn đạt được là một cái gì đó giống như các nút quay lại được tìm thấy trong ứng dụng Âm nhạc iOS 7, chỉ có một chevron duy nhất.

Cảm ơn.


nhìn vào câu trả lời này stackoverflow.com/a/20300577/1589731
ayalcinkaya

Tại sao bạn không chụp ảnh yêu cầu của bạn là gì? Và giới thiệu nó trong leftBarButtonItem.
Vishal Sharma

Lý do tại sao tôi không sử dụng phương pháp hình ảnh là 1. Rất khó để có được hình ảnh hoàn hảo của nút quay lại và 2. Sẽ có một số hình thức sai lệch với hình ảnh và nó trông không được tự nhiên, và đó là lý do tại sao Tôi đã đến StackOverflow để được giúp đỡ về cách thực hiện điều này một cách tự nhiên.
Pan Ziyue

Câu trả lời:


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

Sau đó, bạn có thể loại bỏ tiêu đề mục trở lại nút.

Nếu bạn sử dụng Storyboard, bạn có thể đặt Nút Back của trình kiểm tra thuộc tính điều hướng với khoảng trắng.


95
Có một vấn đề với các tiêu đề lớn: chúng không nằm ở giữa mà được đẩy sang phải, giống như nếu văn bản nút quay lại vẫn còn đó
sonxurxo

11
Điều này không hoạt động nếu người dùng đã bật "Trợ năng - Hình dạng nút"
Mikael Bartlett

22
Tôi nghĩ rằng đây là một câu trả lời tốt hơn:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
benjamin

19
Bất kỳ giải pháp với số ma thuật trong đó là một ý tưởng tồi. Với việc đẩy sang tự động thanh toán, các lớp kích thước, các tính năng trợ năng, v.v. sử dụng các giá trị không đổi như thế này chắc chắn sẽ cắn bạn.
Michael Peterson

3
Để cải thiện khi bình luận benjamin, bạn nên thiết lập này cho UIControlStateHighlightedcũng
n_b

411

Để đặt tiêu đề nút quay lại cho bộ điều khiển xem mà không thay đổi tiêu đề, hãy sử dụng:

Mục tiêu-C:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];

Nhanh:

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

Để rõ ràng, điều này được thực hiện trên trình điều khiển xem mà bạn sẽ thấy nếu bạn nhấn nút quay lại. tức là thay vì thấy '<Cài đặt' bạn muốn chỉ nhìn thấy '<' thì trên SettingsViewControll của bạn, bạn sẽ đặt cái này vào trong init. Sau đó, bạn không gặp phải bất kỳ vấn đề nào của tiêu đề không hiển thị khi bạn nhìn vào chính bộ điều khiển xem.


1
Tôi không biết tại sao câu trả lời khác được đánh dấu là chính xác, nó chỉ xóa tiêu đề để nút quay lại có "tiêu đề" để hiển thị, nhưng đó hoàn toàn không phải là cách tiếp cận chính xác! Điều này nên là câu trả lời đúng.
Pach

8
Ngoài ra với bất kỳ ai sử dụng Swift, đó là navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .Plain, target: nil, action: nil). Không khó để chuyển đổi từ Obj-C sang Swift, nhưng tôi sẽ cứu bạn khỏi
rắc rối

15
@BenjaminPiette bạn đang gọi cái này trên UIViewControll mà bạn sẽ thấy nếu bạn nhấn nút quay lại? Không phải UIViewControll hiển thị nút quay lại.
DonnaLea

2
Thật là một giải pháp tao nhã! Cảm ơn. Nó chỉ cảm thấy không đúng khi làm điều bù đắp.
hyd00

2
giải pháp này hoạt động hoàn hảo nếu bạn viết dòng mã này trên bộ điều khiển trước đó trong ngăn xếp điều hướng.
Bohdan Savych

128

Nếu bạn đang sử dụng Storyboards, bạn có thể truy cập Attributes InspectorViewContoder Navigation Item(nhấp vào Navigation Bar) và đặt thuộc Back Buttontính thành "" (một ký tự khoảng trắng). Điều này sẽ đặt tiêu đề Nút Quay lại thành một ký tự khoảng trắng, hiển thị chevron. Không cần phải lộn xộn với mã.

hình ảnh ví dụ

Lưu ý rằng điều này sẽ đặt Back Buttontiêu đề cho Nút Quay lại sẽ tách biệt với Trình điều khiển Chế độ xem này từ nút được đẩy lên trên, không phải cho tiêu Back Buttonđề sẽ được hiển thị bên trong Trình điều khiển này!


10
Tôi ước tôi có thể nâng cao điều này hơn nữa: "Lưu ý rằng điều này sẽ đặt tiêu đề Nút Quay lại cho Nút Quay lại sẽ phân biệt với Trình điều khiển Chế độ xem này, được đặt trên đỉnh của nó, không phải cho Nút Quay lại sẽ được hiển thị bên trong này Người điều khiển! "
Jayson Lane

121

Điều này hoạt động với tôi để chỉ hiển thị chevron 'back' mà không có bất kỳ văn bản nào:

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

Đặt thuộc tính này trong viewDidLoadTrình điều khiển xem hiển thị thanh điều hướng và nó sẽ thực hiện thủ thuật.

Lưu ý: Tôi mới chỉ thử nghiệm nó trong iOS 7, nằm trong phạm vi câu hỏi.


33
Điều đó có tác dụng phụ là loại bỏ nhãn tiêu đề ở giữa thanh điều hướng.
Pwner

7
Đặt tiêu đề của VC đẩy trên 'viewWillAppear' với cùng thuộc tính. Cách này không bị loại bỏ.
Guto Araujo

5
Tôi đã chuyển đoạn mã đó sang -viewDidLoadVC mà tôi không muốn văn bản Quay lại. Tuy nhiên, những gì tôi phát hiện ra sau đó là khi tôi bật VC thứ 2 từ navigationControllervăn bản Tiêu đề xuất hiện ngay sau đó, không phải ngay lập tức. Tôi đoán một video sẽ minh họa điều này tốt hơn nên đây là: link
Pan Ziyue

1
Đây không phải là câu trả lời hay nhất, vui lòng tham khảo câu trả lời của andyleehao: [[UIBarButtonItem ngoại hình] setBackButtonTitlePocationAdjustment: UIOffsetMake (0, -60) choBarMetrics: UIBarMetricsDefault];
lmnbeyond

1
Đây là câu trả lời đúng theo tài liệu của Apple: "Khi người nhận ở trên ngăn vật phẩm điều hướng và đứng thứ hai từ trên đỉnh, nói cách khác, bộ điều khiển khung nhìn của nó quản lý các chế độ xem mà người dùng sẽ điều hướng trở lại giá trị trong thuộc tính này được sử dụng cho nút quay lại trên thanh điều hướng trên cùng. Nếu giá trị của thuộc tính này là 0, hệ thống sẽ sử dụng chuỗi Hồi quy Back Back làm văn bản của nút quay lại. "
Raphael Oliveira

27

Khi bạn đặt tiêu đề của nút, hãy sử dụng @ "" thay vì @ "".

--BIÊN TẬP--

Có điều gì thay đổi khi bạn thử các chuỗi khác không? Tôi đang sử dụng mã sau đây thành công:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString là một biến được đặt thành @ "" hoặc @ "Quay lại", tùy thuộc vào việc tôi đang dùng iOS 7 hay phiên bản thấp hơn.

Một điều cần lưu ý là mã này không nằm trong bộ điều khiển cho trang tôi muốn tùy chỉnh nút quay lại. Nó thực sự nằm trong bộ điều khiển trước khi nó nằm trên ngăn điều hướng.


Hmm, iOS 7 dường như không thay đổi điều đó. Nó tiếp tục sử dụng "Quay lại" làm tiêu đề. Nếu tôi đặt setLeftBarButtonItem:backButtonthay vì không có gì sẽ ở đó.
Pan Ziyue

1
Nếu đó là trường hợp và không có gì xảy ra khi bạn đặt tiêu đề thành một cái gì đó khác, tôi nghĩ bạn sẽ phải thử chuyển mã của mình sang trình điều khiển xem cha mẹ. Tôi đang sử dụng mã tôi đã đăng ở trên trong phương thức chuẩn bị của tôi.
Kamaros

27

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

Đôi khi nó là hữu ích để nhìn thấy mọi thứ trong bối cảnh. Dưới đây là một dự án tối thiểu ẩn văn bản "trở lại" nhưng vẫn hiển thị mũi tên.

Bảng phân cảnh

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

Có một phân biệt hiển thị từ nút "Hiển thị Trình điều khiển Chế độ xem Thứ hai" sang Trình điều khiển chế độ xem thứ hai.

Tôi cũng đã thêm một Mục điều hướng vào trình điều khiển chế độ xem thứ hai để nó có tiêu đề. Đây là tùy chọn. Nó không ảnh hưởng đến nút quay lại.

FirstViewControll.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewControll.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

Phương pháp thay thế (chỉ IB, không có mã)

Trên bảng phân cảnh, chọn mục điều hướng cho trình điều khiển chế độ xem đầu tiên (không phải mục thứ hai). Chỉ cần nhập một khoảng trắng cho văn bản Nút Quay lại.

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


Khái niệm chính "đối với trình điều khiển chế độ xem đầu tiên (không phải là trình điều khiển thứ hai)" như tên của VC mà bạn muốn quay lại để có trách nhiệm đưa ra tiêu đề này.
buguibu

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

1
Bạn có thể sử dụng backItem thay vì topItem. TopItem sẽ ẩn tiêu đề, trong khi backItem sẽ ẩn tiêu đề nút quay lại.
Ravi Ojha

2
Đây là giải pháp duy nhất nếu childViewControll ở độ sâu 2+ trong ngăn xếp con của NavigationContoder
Nathaniel Blumer

2
Điều này cũng sẽ loại bỏ tiêu đề của bộ điều khiển xem trước đó. Trong hầu hết các trường hợp, điều này sẽ tệ
CalZone

11

Trên iOS7, Apple đã giới thiệu hai thuộc tính mới cho UINavestionBar, 'backTheicatorTransitionMaskImage' và 'backTheicatorImage'.

Chỉ cần gọi một lần:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

Nó sẽ hiển thị một hình ảnh tùy chỉnh thay vì glyph chevron mặc định, kế thừa màu sắc của keyWindow.

Và để xóa tiêu đề, tôi sẽ đề nghị câu trả lời của Kamaros. Hãy nhớ gọi mã này trên trình điều khiển chế độ xem đang đẩy trình điều khiển chế độ xem mới của bạn. Xóa văn bản tiêu đề của UIBarButtonItem trên iOS


Để điều chỉnh màu sắc [[Xuất hiện UINavestionBar] setTintColor: [UIColor whiteColor]];
Mazen Kasser

10

Tôi đã không có nhiều thành công với các câu trả lời được cung cấp nhưng tôi đã tìm thấy một công việc thực sự đơn giản xung quanh. Trong bảng phân cảnh của bạn, bạn có thể nhấp vào Mục điều hướng của UIViewContoder và đặt văn bản nút quay lại. Tôi đặt nó vào một không gian '' duy nhất và nó cho tôi hành vi mà tôi đang tìm kiếm.nhập mô tả hình ảnh ở đây


10

Điều này làm việc cho tôi trong iOS10. Gọi cái này từ viewDidLoad của bộ điều khiển xem.

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

6

Giải pháp đơn giản cho vấn đề này, hoạt động trên iOS7 cũng như 6, là đặt chế độ xem tiêu đề tùy chỉnh trong viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

Sau đó, trong viewWillAppear: bạn có thể gọi một cách an toàn

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

Vì chế độ xem tiêu đề của bạn là chế độ xem tùy chỉnh, nó sẽ không bị ghi đè khi di chuyển trở lại trong ngăn xếp điều hướng.


Tôi chỉ cần phần sau của mã chứ không phải UILabel trống. Tôi đã gọi [self.navigationItem.backBarButtonItem setTitle:@" "];trong viewWillAppear nhưng nó không hoạt động trên các khung nhìn được trình bày sau khi loại bỏ chế độ xem theo chế độ.
Diziet

6

Trên thực tế bạn có thể làm điều này chỉ với một mẹo:

Ghi đè UINavigationBarlớp và thêm dòng mã này:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

Sau đó, khởi tạo của bạn UINavigationControllervới lớp UINavestionBar tùy chỉnh này, v.v.UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

Hi vọng điêu nay co ich


Điều này làm việc cho tôi. Mặc dù có vẻ như có một chút sai sót trong hoạt hình đẩy trên iOS 7: tiêu đề dường như nhường chỗ cho nút quay lại sau đó tập trung vào vì không có.
zekel

Vâng, hãy thử sử dụng titleView tùy chỉnh thay vì đặt trực tiếp navigationItem.title. Tôi nghĩ rằng nên khắc phục vấn đề của bạn.
rordulu

giải pháp này là lý do tuyệt vời vì nó trên toàn cầu cho mọi điều hướng có lớp con. Cảm ơn
Yetispapa

5

Tôi đã có thể kết hợp một cái gì đó với nhau bằng câu trả lời của DonnaLea. Đây là cách giải pháp xuất hiện trong lớp con UIViewControll của tôi:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

Vấn đề với câu trả lời ban đầu là nó loại bỏ tiêu đề khỏi bộ điều khiển khi bạn bật lại. Cố gắng đặt lại tiêu đề trong viewWillDisappear là quá muộn trong quá trình chuyển đổi; Nó làm cho tiêu đề quay trở lại thay vì hoạt hình độc đáo. Tuy nhiên, willMoveToParentViewControll xảy ra sớm hơn và cho phép thực hiện đúng hành vi.

Hãy cẩn thận: Tôi chỉ thử nghiệm điều này với một lần đẩy / bật UINavestionControll bình thường. Có thể có thêm hành vi bất ngờ trong các tình huống khác.


4

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.



3

Không phải câu trả lời đã giúp tôi. Nhưng một mẹo đã làm - tôi vừa xóa tiêu đề của trình điều khiển chế độ xem đã đẩy (nơi nút quay lại sẽ đến) ngay trước khi đẩy nó.

Vì vậy, khi chế độ xem trước không có tiêu đề, trên iOS 7, nút quay lại sẽ chỉ có một mũi tên, không có văn bản.

Trên viewWillAppearquan điểm đẩy, tôi đặt lại tiêu đề ban đầu.


1
Hmm, thủ thuật này hoạt động. Tuy nhiên, có vẻ như những từ trên đó đôi khi sẽ nhấp nháy. Không phải là một cách giải quyết tốt nhưng vẫn là một cách tốt. +1
Pan Ziyue

3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

Tôi đã có một vấn đề tương tự và tôi đã làm theo cách này.

--BIÊN TẬP--

đây là một giải pháp khi bạn thực sự muốn xóa văn bản tiêu đề của tất cả UIBarbuttonItem. Nếu bạn chỉ muốn loại bỏ tiêu đề của mục nút thanh phía sau, không có một giải pháp tiện lợi đơn giản nào. Trong trường hợp của tôi, vì tôi chỉ có một vài UIBarButtonItems cần hiển thị văn bản tiêu đề, tôi chỉ thay đổi các tiêu đề của các nút cụ thể đó là titleTextAttribution. Nếu bạn muốn cụ thể hơn, hãy sử dụng mã bên dưới, điều này sẽ chỉ thay đổi các nút trên thanh điều hướng:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

1
Điều này làm việc cho tôi, tuy nhiên bạn có thể xem nhanh văn bản khi nhấn lại.
Diziet

3
@Diziet thử thêm tương tự cho Nhà nước UIControlStateHighlightedcũng
CoderPug

2
Điều này hoạt động tốt, nhưng điều này cũng "ẩn" tất cả các nút khác, không chỉ Nút Quay lại ... Có ý tưởng nào để giải quyết vấn đề này không?
Urkman

3

Điều này là sử dụng lớp con navigationControllerloại bỏ "Quay lại".

Tôi đang sử dụng để xóa nó, vĩnh viễn thông qua ứng dụng.

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                                       style:UIBarButtonItemStylePlain
                                                                                      target:nil
                                                                                      action:nil];
}

@end

3
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];

1
Xin vui lòng, thêm lời giải thích cho câu trả lời của bạn.
Alex

1 tạo màu giống như thanh điều hướng 2 làm cho kích thước văn bản đủ nhỏ để không ép tiêu đề
Bill Xie

Tôi đã xem lại câu trả lời của bạn, bạn nên luôn ủng hộ câu trả lời của bạn.
Alex

2

Ẩn nút quay lại Tiêu đề của thanh điều hướng

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

2

Đây là những gì tôi đang làm cho tôi, đơn giản hơn để loại bỏ tiêu đề của nút quay lại

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}

2

Swift 3.1 Bạn có thể thực hiện việc này bằng cách triển khai phương thức ủy nhiệm của UINavestionControll. Nó sẽ chỉ ẩn Tiêu đề bằng nút quay lại, chúng tôi vẫn sẽ nhận được hình ảnh mũi tên quay lại và chức năng mặc định.

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }

1

Bạn cũng có thể sử dụng điều này:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

Điều này làm việc cho tôi


1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }

1

Giải pháp hoàn hảo trên toàn cầu

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}

giải pháp tuyệt vời nhất ... nó cũng sử dụng không gian như trước đây ... nó trở nên trong suốt ...
Laszlo

Nó xóa văn bản khỏi tất cả các UIBarButtonItems của ứng dụng
Mikel Sanchez

1

Tôi tạo một lớp tùy chỉnh cho UINavigationControllervà áp dụng nó cho tất cả các bộ điều khiển điều hướng trong ứng dụng của tôi. Bên trong UINavigationControllerlớp tùy chỉnh này, tôi đặt UINavigationBarđại biểu thành selfmột lần khi xem.

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

Sau đó, tôi thực hiện phương thức đại biểu:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

Bằng cách này, tôi chỉ cần gán lớp tùy chỉnh của mình cho tất cả các bộ điều khiển điều hướng của mình và nó xóa tiêu đề khỏi tất cả các nút quay lại. Và để rõ ràng, tôi luôn đặt tiêu đề cho tất cả các bộ điều khiển chế độ xem khác của mình bên trong viewWillAppearđể tiêu đề luôn được cập nhật ngay trước khi chế độ xem xuất hiện (trong trường hợp nó bị xóa bởi các thủ thuật như thế này).


1

Chỉ cần nhập một khoảng trống cho mục điều hướng nút Quay lại hoạt động !!


1
Điều này phù hợp như là một nhận xét hơn là một câu trả lời.
Al Lelopath

1

Nếu giống như tôi, bạn đang sử dụng chế độ xem tùy chỉnh thay vì UINavigationBarvà bạn bị kẹt với nút quay lại thì bạn phải thực hiện một chút công việc mà cảm thấy hơi khó hiểu.

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

Có vẻ như nếu nó không được trình bày thì không có vấn đề gì, nó sẽ cố gắng hiển thị một tiêu đề, điều này có nghĩa là nó được hiển thị sau đó được ẩn trước khi nó được vẽ và giải quyết vấn đề.


1
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

1

Tôi đã tạo một danh mục cấu hình zero rất đơn giản để ẩn tất cả các tiêu đề nút quay lại thông qua ứng dụng, bạn có thể kiểm tra nó ở đây . Câu hỏi này đã được chấp nhận câu trả lời, nhưng đối với những người khác nó có thể hữu ích.

BIÊN TẬP:

tập tin .h

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

tập tin .m

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
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.