Cách xóa tất cả tiêu đề nút quay lại của thanh điều hướng


81

Khi tôi ấn a UIViewController, nó có một số tiêu đề ở nút quay lại lúc mới UIViewController, nếu tiêu đề có nhiều văn bản, Nó trông không đẹp trong iPhone 4s Vì vậy tôi muốn loại bỏ nó.

Nếu tôi thêm một số mã trong prepareForSeguechức năng, nó sẽ là một rắc rối.

Bất kỳ cách nào tốt hơn để đạt được điều này?


bạn cũng có thể thay đổi tiêu đề của nút quay lại. và để quay lại, bạn cần có nút quay lại. vì vậy tôi nghĩ không cần phải loại bỏ nút quay lại.
Ashok Londhe

xin vui lòng thông báo sau khi giải quyết vấn đề của bạn.
Ashok Londhe

tham khảo câu trả lời này stackoverflow.com/a/48801613/3976183
Lalit Kumar,

có một bài viết hay về vấn đề này sarunw.com/posts/…
user3672430

Câu trả lời:


128

Nếu bạn muốn quay lại mũi tên để đưa mã sau vào AppDelegatetệp thành didFinishLaunchingWithOptionsphương thức.

For Objective-C

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

For Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

Một tùy chọn khác đưa ra bên dưới.

Trong Objective C

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

Trong Swift

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

CẬP NHẬT:

    let BarButtonItemAppearance = UIBarButtonItem.appearance()

    let attributes: [NSAttributedStringKey: Any] = [
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
            NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
            NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

CẬP NHẬT SWIFT 4.1:

    let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

Sử dụng Offset

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)

Vì vậy, có thể vấn đề của bạn đã được giải quyết.

Chúc bạn viết mã vui vẻ.


8
setBackButtonTitlePositionAdjustmentkhông phải lúc nào cũng hoạt động, khi tiêu đề nút quay lại rất dài, nhưng không đủ dài để chuyển thành "Quay lại", tiêu đề ở giữa sẽ di chuyển sang phải.
zgjie

3
@zgjie nó chỉ là một chủ đề về mức độ bù đắp của bạn. bạn có thể dễ dàng thay thế '-60' bằng '-6000' và quên đi vấn đề này
slxl 29/07/2016

9
Chỉ cần chính xác một chút ở đây, tiêu đề thuộc về bộ điều khiển chế độ xem TRƯỚC. Vì vậy, hãy nhớ đặt nó ở đó, trước phương thức presentViewController hoặc pushViewController.
Benjamin

1
Rất tiếc, điều này không hoạt động trong AppDelegate. "Giá trị của loại AppDelegate không có điều hướng thành viên"
Prabhu.

3
@DominikBucher Tôi đã tạo một danh mục cho hành vi này ẩn tiêu đề nút quay lại từ mọi vị trí trong ứng dụng, đây là cách "KHÔNG CÓ GÌ" , chỉ cần thêm danh mục vào dự án của bạn và bạn đã hoàn tất. Tôi thực sự không đồng ý với giải pháp thiết lập vị trí bằng cách sử dụng setBackButtonTitlePositionAdjustment:forBarMetrics:nếu người dùng đã bật hình dạng nút từ cài đặt trợ năng, hình dạng sẽ hiển thị kết thúc với thanh điều hướng xấu xí.
Pratik Jamariya

71

Work's like charm trên Swift 3

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

1
Đây là cái duy nhất hoạt động khi sử dụngnavigationController?.pushViewController(_, animated:)
D. Greg

Cảm ơn, anh bạn. Đây là một trong những duy nhất đã làm việc. Chúc mừng.
Felipe

3
Làm việc cho tôi cũng Swift 4
christijk

1
@MaksimKniazev, có cách nào khắc phục sự cố đó không? Tôi tìm thấy giải pháp duy nhất để cập nhật lại tiêu đề trong viewWillAppear:.
Hemang

4
điều này loại bỏ các tiêu đề của giao diện trước đó
Naser Mohamed

50

Tôi đang sử dụng dòng mã này trong AppDelegatetệp thành didFinishLaunchingWithOptionsphương thức để loại bỏ nút lùi title.

Swift 2.x

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)

Swift 3.x

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

Swift 4.x

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)

17
setBackButtonTitlePositionAdjustmentkhông phải lúc nào cũng hoạt động, khi tiêu đề nút quay lại rất dài, nhưng không đủ dài để chuyển thành "Quay lại", tiêu đề ở giữa sẽ di chuyển sang phải.
zgjie

Nó không phải là một giải pháp lý tưởng. Nếu chúng tôi đặt bất kỳ tiêu đề điều hướng nào mà không thay đổi tiêu đề của mục thanh điều hướng bên trái, thì tiêu đề đó sẽ chuyển sang phải do có cài đặt tiêu đề của thanh điều hướng bên trái.
mathma

2
trong iOS 11, nó bị phá vỡ vị trí nút quay lại. Nó giảm xuống dưới vị trí ban đầu
korgx9

Làm thế nào mà được cho là làm việc? Văn bản sẽ vẫn có thể truy cập được qua VoiceOver.
Lukasz Ciastko

Điều này tạo ra vấn đề khi hủy bỏ hoặc done barbuttonitem không nhìn thấy được khi trình bày imagepicker hoặc một cái gì đó
Nupur Sharma

16

Chỉ cần truy cập ViewController Parent của bạn từ nơi các ViewController khác của bạn phụ thuộc.

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}

15

Chỉ cần sao chép mã này vào didFinishLaunchingWithOptions launchOptions

Swift 5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)

Swift 4

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)

11

nó đơn giản. đặt một khoảng trống trong tiêu đề của nút quay lại và sẵn sàng. Hãy nhớ rằng nó phải ở chế độ xem trước mà bạn muốn xóa văn bản.

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


Giải pháp tốt nhất IMO. Không yêu cầu bạn đặt toàn bộ ứng dụng thành một phong cách rõ ràng cụ thể, điều này có thể có tác động phụ là làm biến mất bất kỳ nút thanh văn bản nào. Câu trả lời có thể được thực hiện tốt hơn nếu nó đề cập rằng bạn phải kéo một navigationItem vào bộ điều khiển của mình nếu không có cái ở đó.
TheJeff

7

Bạn có thể sử dụng xcode 8 và swift 3.0

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

3
Điều này sẽ không xóa hoàn toàn tiêu đề khỏi bộ điều khiển chế độ xem trước đó chứ?
NRitH

1
Vâng, nó sẽ loại bỏ các tiêu đề cho tất cả các ViewControllers đẩy từself.navigationController
Yevhen Dubinin

7

Bạn có thể tạo một lớp con cho tất cả những UIViewControllergì bạn muốn có hành vi này và trong lớp con của viewDidLoad:

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

Bằng cách này, bạn có thể chọn bộ điều khiển nào bạn muốn hoạt động mà không cần mã trùng lặp. Tôi thích bộ điều khiển của mình chỉ nói "Quay lại" hơn là tiêu đề của bộ điều khiển trước đó, vì vậy tôi đặt tiêu đề đó ở đây.


6
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

đã sử dụng dòng mã này trong swift 3.0


1
sẽ ảnh hưởng đến nút hủy cho UISearchController
JAHelia vào

5

Lấy cảm hứng từ câu trả lời của rordulu ở đây , tôi đã kết thúc việc tạo một thanh UINavigationController và UINavigation tùy chỉnh dường như có thể xử lý tất cả các trường hợp của vấn đề phức tạp này.

1) Khởi tạo mới UINavigationControllervới tùy chỉnh của bạn UINavigationBar:

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}

2) Đặt thuộc backItem.titletính của thanh điều hướng thành một chuỗi trống, mỗi khi chế độ xem tự thoát ra

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}

Bây giờ mỗi khi bạn sử dụng bộ điều khiển điều hướng và kết hợp thanh này, nó sẽ không bao giờ có văn bản nút quay lại! 🎉

Lưu ý: điều này sẽ hoạt động tốt nếu cũng sử dụng bảng phân cảnh, chỉ cần đảm bảo thả thành phần thanh điều hướng tùy chỉnh vào chế độ xem


Cảm ơn rất nhiều! Đây là cách tốt nhất để làm điều đó và phải là câu trả lời đúng :)
GameDev

3
Chỉ cần nhận ra rằng điều này có một tác dụng phụ là nó sẽ xóa hoàn toàn tiêu đề mục điều hướng. Vì vậy, khi khung nhìn trước đó hiển thị, nó sẽ không có tiêu đề! Tôi sẽ tiếp tục tìm kiếm giải pháp hoàn hảo cho vấn đề khó chịu này.
Harry Bloom

chết tiệt bạn đúng. Làm sao tôi có thể bỏ lỡ điều đó! Vui lòng cho tôi biết nếu bạn tìm thấy giải pháp khắc phục sự cố này. cảm ơn
GameDev

Bạn có thể tìm ra giải pháp hoàn hảo @HarryBloom không?
Hemang

@Hemang Không phải là một giải pháp hoàn hảo, nhưng tôi đã tìm thấy một thứ hoạt động. Đã thêm câu trả lời thứ hai ở đây stackoverflow.com/a/49094282/1532838
Harry Bloom

3

Tôi thường thêm hoặc thay đổi nút quay lại trong viewDidLoad của UIViewController.

Một cái gì đó như vậy sẽ hoạt động:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

Đừng quên thay đổi và triển khai chức năng được gọi để đóng chế độ xem.

Thậm chí dễ dàng hơn, chỉ cần thay đổi tiêu đề:

self.navigationItem.leftBarButtonItem.title = "Back"

7
Điều này phá vỡ hỗ trợ tích hợp của iOS cho việc vuốt từ trái sang phải để điều hướng trở lại và IMHO, các ứng dụng phá vỡ điều này thực sự gây khó chịu.
NRitH

2

Swift 3:

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

2

Thêm câu trả lời thứ hai ở đây vì đầu tiên của tôi chỉ hoạt động một phần. Phương thức này kém thanh lịch hơn vì nó yêu cầu gọi một phương thức trong mỗi dạng xem trong ứng dụng, tuy nhiên nó hoạt động mà không có bất kỳ tác dụng phụ nào.

Vì vậy, trước tiên, hãy tạo một lớp tiện ích mở rộng UIViewController có chức năng xóa văn bản nút quay lại và thêm nút quay lại tùy chỉnh:

extension UIViewController {

func setBackButton() {
    navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

Thứ hai, chúng ta có thể chỉ cần gọi hàm này trong viewDidLoadmỗi bộ điều khiển chế độ xem mà bạn cần.


2

Giải pháp đơn giản:

Trong khi bạn đang đẩy bộ điều khiển thứ 2 từ bộ điều khiển thứ nhất, hãy đặt self.navigationItem.title = "" trong viewWillDisappear của bộ điều khiển thứ nhất. Nó ẩn tiêu đề nút quay lại khỏi bộ điều khiển thứ 2.

Trạng thái trên ẩn tiêu đề bộ điều khiển đầu tiên, do đó khi chúng tôi quay lại, chúng tôi muốn lại tiêu đề cho bộ điều khiển thứ nhất. Đối với điều đó, chúng tôi đã thêm tiêu đề cho bộ điều khiển thứ nhất trong phương thức viewWillAppear của bộ điều khiển thứ nhất.

Tham khảo các phương pháp sau (của bộ điều khiển thứ nhất)

    override func viewWillDisappear(_ animated: Bool) {
    self.navigationItem.title = ""
}

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}

2

Swift 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

Hủy bỏ và nút Done của imagepicker đang biến mất trong cách tiếp cận này
Nupur Sharma

2

Cập nhật câu trả lời cho Swift 4.2

Làm việc với UIAppearancelà một cách giải quyết vấn đề UIBarButtonItemrõ ràng hơn nhưng nó sẽ khiến tất cả các vấn đề phải có văn bản rõ ràng. Một phiên bản cải tiến của giải pháp có thể là để kiểm tra xem UIBarButtonItemcó chứa trong một UINavigationBar.

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

1

Hoạt động trên Swift 5 :

        self.navigationItem.backBarButtonItem?.title = ""

Xin lưu ý rằng nó sẽ hiệu quả đối với bộ điều khiển chế độ xem được đẩy tiếp theo không phải bộ điều khiển hiện tại trên màn hình, đó là lý do tại sao nó rất khó hiểu!

Ngoài ra, hãy kiểm tra bảng phân cảnh và chọn mục điều hướng của bộ điều khiển chế độ xem trước đó, sau đó nhập nội dung nào đó vào Nút Quay lại (Thanh tra).


1

Tôi có một giải pháp đơn giản cho những người không muốn sử dụng phương pháp xáo trộn hoặc sao chép mã tương tự trong các bộ điều khiển chế độ xem khác nhau.

Để xóa tiêu đề nút quay lại, hãy tạo một lớp con UINavigationController và ghi đè phương thức pushViewController (_, animation :):

final class CustomNavigationController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {

        super.pushViewController(viewController, animated: animated)

        let backBarButtonItem = UIBarButtonItem()
        backBarButtonItem.title = nil

        viewController.navigationItem.backBarButtonItem = backBarButtonItem
    }
}

0

Tôi không biết tại sao nhưng tôi thấy vấn đề với việc ẩn tiêu đề nút quay lại trong iPhone điểm cộng nhưng trong thiết bị không có dấu cộng hiển thị chính xác với

leftBarButtonItem.title = ""

Vì vậy, tôi đã tìm thấy cách đơn giản. Nó được đặt màu sắc thành rõ ràng trong NavigationBar của NavigationViewController trong chế độ tự động thanh toán. Có thể có vấn đề nếu bạn sử dụng các biểu tượng hoặc ô văn bản có màu. Nhưng trong trường hợp của tôi, tôi không sử dụng nó như tất cả.


0

Chỉ cần sử dụng cái này:

func removeBackButton(vc:UIViewController) {
        let button = UIButton.init(type: .custom)
        button.setImage(UIImage.init(named:""), for: .normal)
        let leftBarButton = UIBarButtonItem.init(customView: button)
        vc.navigationItem.leftBarButtonItem = leftBarButton
}

Vì vậy, hãy gọi phương thức này trong viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}

0

Bạn có thể thêm phần mở rộng này vào UIViewController Và sau đó gọi hàm này trong mọi viewDidLoad () như: self.updateBackButton ()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}

0

Tôi muốn chia sẻ một giải pháp phù hợp với tôi. Ngoài ra, nó có thể được điều chỉnh dựa trên nhu cầu và yêu cầu của bạn.

Lưu ý, trong trường hợp của tôi, tôi sử dụng bảng phân cảnh để chỉ định CustomNavigationBar

Swift 4.2

class CustomNavigationBar: UINavigationBar {

    override func awakeFromNib() {
        super.awakeFromNib()
        guard let topItem = topItem else { return }
        removeBackButtonTitle(for: topItem)
    }

    override func pushItem(_ item: UINavigationItem, animated: Bool) {
        removeBackButtonTitle(for: item)
        super.pushItem(item, animated: animated)
    }

    func removeBackButtonTitle(for item: UINavigationItem) {
        item.backBarButtonItem = UIBarButtonItem()
    }
}

0

Hoạt động cho Swift 4.2

Sử dụng dòng mã trong AppDelegatetệp vàodidFinishLaunchingWithOptions

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)

Điều này làm ẩn văn bản nút thanh quay lại nhưng tiếc là không căn giữa tiêu đề thanh điều hướng
Giorgio

0

Swift 4.2 & 5

Thay vì chơi với màu thanh điều hướng sẽ có tác dụng phụ nếu bạn đang sử dụng bộ chọn hình ảnh bất cứ lúc nào sau đó trong mã của mình.

Sử dụng mã dưới đây:

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

Gọi nó từ ViewController đầu tiên của bạn:

self.awakeFromNib()

0

cho nhanh 4,5

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

0

Chỉ cần tạo phần mở rộng của UIViewControllervới chức năng ghi đè awakeFromNib()và thực hiện UIBarButtonItemvới tiêu đề trống và cung cấp cho navigation backBarButtonItem.

extension UIViewController {

  open override func awakeFromNib() {
    let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarBtnItem
  }

}

0

Đặt mã dưới đây vào bất kỳ mã nào trong số UIViewcontroller extensionđó sẽ ẩn tất cả UIViewcontrollervăn bản phía sau

open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }

0

trong viewDidLoad()

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

0

Tôi đã tìm thấy một giải pháp đơn giản: -

tại PersingtingViewController's viewWillDisappearphương pháp jsut đặt

self.title = ""

và đặt titlecho phương thức PersingtingViewController'son viewWillAppear. Và lặp lại điều này cho tất cả viewControllerscác navigationStackngoại trừ người cuối cùng.


0

Trên iOS 14 hiện có thuộc backButtonDisplayModetính trong UINavigationItemlớp. Vì vậy, để xóa tiêu đề nút quay lại, bạn có thể sử dụng

navigationItem.backButtonDisplayMode = .minimal

trong viewDidLoadfunc của viewController nơi bạn muốn xóa nó.

Để loại bỏ nó trong tất cả các điều hướngBar tôi đã sử dụng kỹ thuật xoay

import UIKit

private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
        if didAddMethod {
            class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

extension UIViewController {
    
    static func swizzle() {
        let originalSelector1 = #selector(viewDidLoad)
        let swizzledSelector1 = #selector(swizzled_viewDidLoad)
        swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
    }
    
    @objc open func swizzled_viewDidLoad() {
        if let _ = navigationController {
            if #available(iOS 14.0, *) {
                navigationItem.backButtonDisplayMode = .minimal
            } else {
                // Fallback on earlier versions
                navigationItem.backButtonTitle = ""
            }
        }
        swizzled_viewDidLoad()
    }
}

Và trong application(_:didFinishLaunchingWithOptions:)cuộc gọi

UIViewController.swizzle()
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.