Xóa văn bản khỏi nút Quay lại giữ biểu tượng


92

Tôi muốn xóa văn bản khỏi nút quay lại, nhưng tôi muốn giữ lại biểu tượng. Tôi đã thử

let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton

Tuy nhiên, điều này sẽ loại bỏ hoàn toàn văn bản và biểu tượng.

Câu trả lời:


98

Phương pháp của @ rmd2 gần như đúng, nhưng thay vào đó, bạn nên chọn thanh điều hướng của bộ điều khiển mà nút quay lại sẽ trỏ đến và nhập " "vào trường Nút Quay lại.

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


1
cách tồi tệ nhất, nếu viewController không có Navigationbar tôi sẽ phải thêm để loại bỏ các văn bản
Daniel Beltrami

142

Tôi biết điều này đã có câu trả lời, nhưng bạn cũng có thể làm điều đó trong mã (trong trường hợp bạn đang làm việc với ngòi)

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

Thêm phần trên trong bộ điều khiển chế độ xem đầu tiên.

Lưu ý rằng bạn cần thực hiện việc này cho từng bộ điều khiển chế độ xem đang đẩy. Vì vậy, nếu bạn có 3 bộ điều khiển chế độ xem và bạn muốn xóa văn bản phía sau khỏi tất cả chúng, bạn sẽ phải thêm dòng trong bộ điều khiển chế độ xem 1 và 2.


5
Đây là giải pháp tốt nhất mà tôi đã thấy cho đến nay mang lại cho tôi không gặp khó khăn
lostAtSeaJoshua

4
.Plainđã được đổi thành .plain. Không có vốn p.
Gal

Hoàn hảo..! Đó là điều tôi muốn.
JD.

Giải pháp tốt nhất. Cảm ơn.
Baran Emre

1
@ GastónAntonioMontes, nó không làm việc trên iOS13, nhưng đó là một quầy chút trực quan: tiêu đề trống backBarButtonItem cần được khai báo trên đẩy điều khiển xem, không phải là đẩy một
Martin

49

Sau khi tìm kiếm rất nhiều, tôi đã tìm thấy giải pháp tốt nhất và đơn giản, điều này sẽ ảnh hưởng đến tất cả các viewControllers được viết trong Swift 4.2 và cũng hoạt động trong Swift 5

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

Chào mừng @ e.dimitrow
iOS Lifee

1
Hoạt động như sự quyến rũ
Jerry Oka vào

3
Lưu ý rằng điều này sẽ chỉ làm việc nếu ViewController của bạn được chứa trong một Storyboard hoặc NIB ...
Nathaniel Blumer

1
Một giải pháp thiên tài!
WM

3
Điều này từng hoạt động với tôi, nhưng không còn nữa (nó vẫn hoạt động trên trình mô phỏng iOS 12, chỉ không phải là iOS 13 mới nhất) ...
tanya

35

Văn bản của nút quay lại phụ thuộc vào tiêu đề của chế độ xem chính.

Mẹo là xóa tiêu đề nếu chế độ xem chính biến mất và đặt lại tiêu đề nếu nó được hiển thị lại:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // needed to clear the text in the back navigation:
    self.navigationItem.title = " "
}

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

33

Nếu bạn muốn loại bỏ các tiêu đề của một nút quay lại từ một bộ điều khiển xem đẩy, chúng ta hãy nói <Settingsđến <trong subSettingsViewController sau đó bạn đã thiết lập backBarButtonItem tiêu đề trong SettingsViewController của () viewWillDisappear phương pháp.

Mục tiêu-C:

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}

Nhanh:

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

1
.Plainđã được đổi thành .plain. Không có vốn p.
Gal

1
Câu trả lời cần được cập nhật cho hành vi searchController. Ví dụ, nếu bạn sử dụng một resultsVC và tap vào một mục mà đẩy một VC, phương pháp viewWillDisappear từ searchController ban đầu riêng biệt không được gọi, vì thế mà tiêu đề vẫn còn đó
H4Hugo

Đây không phải là một cách tiếp cận tốt nếu bạn đang tìm kiếm giải pháp cho màn hình trong toàn bộ ứng dụng. - Nếu bạn thêm mã này vào một số "Base View Controller", viewWillDisappear của bộ điều khiển chế độ xem thứ nhất sẽ được gọi sau viewDidAppear của bộ điều khiển chế độ xem thứ hai (nơi bạn thường đặt tiêu đề) ... điều này sẽ làm rối các tiêu đề. Cách tốt nhất là nút quay lại ghi đè
Mithra Singam

Giải pháp hoàn hảo Cảm ơn
SURESH SANKE 28/12/18

28

Nếu bạn muốn có mũi tên quay lại, hãy đặt mã sau vào tệp AppDelegate vào phương thức didFinishLaunchingWithOptions.

Đối với Swift

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

2
tôi thích cái này vì bạn có thể chuẩn hóa kiểu ứng dụng của mình trong một tệp duy nhất và gọi nó một lần từ người đại diện ứng dụng
Aaronium112

4
Nó thực sự thoải mái và giải pháp nhanh, Nhưng ... nó có thể là khó khăn nếu bạn đã mục nút thanh khác ngoại trừ một trở lại:)
vhristoskov

3
Một nhận xét, nếu bạn chỉ triển khai thuộc tính ".normal", bạn sẽ thấy văn bản khi nhấp chuột. Thêm cùng một dòng cho ".selected", ".highlighted" và ".disabled." để đảm bảo bạn không nhìn thấy văn bản nhấp nháy.
Nick N

1
Tôi nghĩ điều này sẽ có tác dụng phụ, các nút thanh khác ngoài nút quay lại cũng sẽ bị ảnh hưởng và sẽ có màu văn bản rõ ràng :(
dhin

23

Trong trường hợp của tôi, đối với biểu tượng và tiêu đề tùy chỉnh, điều này đã thực hiện một thủ thuật (Swift 4)

    let imgBack = UIImage(named: "ic_back")

    navigationController?.navigationBar.backIndicatorImage = imgBack
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack

    navigationItem.leftItemsSupplementBackButton = true
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)

1
dòng cuối cùng trong mã đó hoạt động hoàn hảo đối với tôi. Tất cả các đề xuất khác không hoạt động, có thể là do các bộ điều khiển chế độ xem của tôi đều được điều khiển bởi bộ điều khiển nav. Trong trường hợp nào, điều hướngController? là thực sự cần thiết.
Salx

Bạn sẽ cần bốn dòng trên cùng nếu bạn muốn thêm nút quay lại tùy chỉnh. Nếu không dòng cuối cùng sẽ thực hiện thủ thuật.
Rafiqul Hasan

14

Tôi đã giải quyết vấn đề này bằng cách thêm dấu "" trên Tiêu đề StoryBoard của ViewController trước đó. Chỉ là một khoảng trắng, không trống; D

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


Tôi cần màn hình trước để có tiêu đề, vì vậy tôi đoán điều đó sẽ không hiệu quả với tôi.
lmiguelvargasf

2
Tôi đã bỏ trống tiêu đề đó nhưng tiêu đề vẫn xuất hiện trong tiêu đề nút quay lại
Himali Shah

1
không bỏ trống Tiêu đề, trường, đặt "" (khoảng trắng) trong trường Nút Quay lại
Kiril S.

13

Cuối cùng đã tìm ra giải pháp hoàn hảo.

Chỉ cần thêm một Hình ảnh trong suốt và thêm mã sau vào AppDelegate của bạn.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

1
Đây chắc chắn là câu trả lời tốt nhất. Trước đây tôi đã sử dụng bản UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustmenthack mà hầu hết các câu trả lời khác đề xuất, nhưng nó đã bị hỏng trên iPhone X đối với bộ điều khiển chế độ xem có tiêu đề dài. Giải pháp này hoạt động hoàn hảo.
Ned

3
Câu trả lời tốt nhất. Hoạt động tốt hơn màu văn bản trong suốt.
William T.

1
Giải pháp tốt nhất mà tôi đã sử dụng trong 4 năm qua! Bạn làm điều đó một lần, ở một nơi và cho tất cả các bộ điều khiển chế độ xem !!!
korgx9,

1
Khi tôi thử điều này với iOS 12, văn bản vẫn xuất hiện bên cạnh hình ảnh. :(
Sean McMains

13

trong 4 nhanh chóng

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

Xin cảm ơn, nó đã giúp tôi ra, (Swift 4.0, Xcode 10.1, iOS 12.1.1), nhờ
infinity_coding7

3
NHƯNG, bạn sẽ bị mất danh hiệu của bạn trong vc mẹ
Wei Lu

1
Nếu có tiêu đề lớn thì topItem là LargeTitle. Không hoạt động
Saranjith

10

Đối với Swift 4+, hãy đặt những dòng này vào AppDelegatelúcdidFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

Khi bạn đặt giao diện trong ứng dụng ủy quyền, màu nền trước rõ ràng dành cho mọi UIBarButtonItem, phải không? Vì vậy, nếu tôi thêm một UIBarButtonItem với văn bản, tôi có phải thay đổi màu nền trước cho nút này theo cách thủ công không?
kuzdu

1
Điều này là tốt nhưng khi bạn nhấn nút quay lại, nó vẫn hiển thị văn bản
William T.

Nó hoạt động nhưng làm cho nút thanh khác biến mất trong iOS 11. Câu trả lời từ Rafiqul Hasan ở trên có thể khắc phục sự cố
huync

8

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

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

Đúng một cái. Trong ios 13, navigationItem.backBarButtonItem không hoạt động. Nó đã tiết kiệm hàng giờ nỗ lực của tôi. Cảm ơn
Manish

5

Nếu bạn có ViewControllerA và bạn muốn điều hướng đến ViewControllerB, trong ViewControllerA, bạn nên đặt navigationItem hiện tại bằng UIBarButtonItem mới và tiêu đề thành một chuỗi có khoảng trống trước khi đẩy sang bộ điều khiển chế độ xem khác:

Đặt tiêu đề thành một chuỗi có khoảng trống, bạn không thể đặt nil hoặc "" (chuỗi trống) vì giá trị mặc định là nil

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)

5

Đặt mã này vào mỗi VC để đẩy một mã khác

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

3
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)

self.navigationItem.leftBarButtonItem = barButton

func backButtonPressed(btn : UIButton) {

    // Your code
}

3

Để xóa khỏi tất cả các bộ điều khiển chế độ xem trong ngăn xếp bộ điều khiển điều hướng:

lớp con UINavigationController và thêm cái này:

override func show(_ vc: UIViewController, sender: Any?) {
    setEmptyBackButton(vc)
    super.show(vc, sender: sender)
}

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    setEmptyBackButton(viewController)
    super.pushViewController(viewController, animated: animated)
}

func setEmptyBackButton(_ viewController: UIViewController) {
    viewController.navigationItem.backBarButtonItem =
        UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

2

Đôi khi nó không hoạt động khi chỉ thay đổi màu tiêu đề, trong trường hợp tiêu đề dài. Vì nó có thể chuyển tiêu đề thanh điều hướng sang trái. Vì vậy, để ngăn chặn nó, bạn có thể cần phải di chuyển tiêu đề của nút thanh theo chiều ngang và làm cho nó trong suốt:

let barButtonItemAppearance = UIBarButtonItem.appearance()
    barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

1

Đối với tôi, điều này đã thực hiện một mẹo:

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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.title = "my amazing title"
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

Chú ý rằng nếu bạn chỉ đặt tiêu đề mà không sửa đổi các backBarButtonItem nó sẽ xuất hiện để làm việc. Nhưng nếu bạn cố gắng quay lại bằng cử chỉ và hơn là hủy và ở trên bộ điều khiển chế độ xem được đẩy, tiêu đề quay lại sẽ quay lại.

Làm việc trong Swift 4


Bạn có thể giải thích?
mrc

Tôi có bộ điều khiển luôn hiển thị văn bản Quay lại với nút quay lại. Vì vậy, trên mã không làm việc trong trường hợp của tôi
Shahbaz Akram

1

Bạn nên chọn thanh điều hướng của bộ điều khiển TỪ mà nút quay lại sẽ trỏ đến và nhập "" vào trường Nút Quay lại.

ví dụ: nếu bạn đang đẩy bộ điều khiển A sang bộ điều khiển B, hãy đặt khoảng trắng vào thanh điều hướng bộ điều khiển A.


1

Xcode 10, Swift 4+

Câu trả lời tương tự cho những người khác ở đây nhưng cần lưu ý rằng nếu văn bản vẫn không được xóa, bạn phải nhấp vào Dấu cách rồi nhấn Enter.

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


1

Chi tiết

  • Phiên bản Xcode 10.2.1 (10E1001), Swift 5

Giải pháp

1. Tạo lớp tùy chỉnh của UINavigationController

import UIKit

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

2. Thêm phần mở rộng UIViewController

import UIKit

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

3. Cập nhật lớp ViewController của bạn

import UIKit

class ViewController: UIViewController {
    override var navigationItemBackButtonTextIsHidden: Bool { return true }
}

Đầy đủ mẫu

import UIKit

// MARK: - ViewController

class ViewController: UIViewController {

    var screenCounter = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationItem()
    }

    override var navigationItemBackButtonTextIsHidden: Bool { return (screenCounter % 2) == 0 }
}

extension ViewController {

    private func setupNavigationItem() {
        navigationItem.title = "VC \(screenCounter)"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
    }

    @objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) {
        guard let navigationController = navigationController else { return }
        let viewController = ViewController()
        viewController.screenCounter = screenCounter + 1
        viewController.view.backgroundColor = .white
        navigationController.pushViewController(viewController, animated: true)
    }
}

// MARK: - NavigationController

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

// MARK: - UIViewController extension

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

Kết quả

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


1

Một thay thế để ghi đè lên tất cả ViewControllersđối với tôi là để mở rộng UINavigationControllervà thiết lập backBarButtonItemcủa topViewController.

Swift 5 trên Xcode 11.2.1:

extension UINavigationController {
    override open func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let backButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        self.topViewController?.navigationItem.backBarButtonItem = backButton
    }
}

1

Cách dễ nhất để làm điều này theo chương trình là đặt backBarButtonItemtừ bộ điều khiển chế độ xem chính (bộ điều khiển gọi push).

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

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

Chi tiết tại đây https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/


1

Bạn có thể xóa văn bản khỏi nút quay lại bằng phương pháp ủy quyền của UINavigationController.

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

}

extension CustomNavigationController: UINavigationControllerDelegate {
    
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: String(), style: .plain, target: nil, action: nil)
    }
    
}

0

Trong Xcode 9.2 với Swift, nó hoạt động như thế này:

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

0

Đối với trường hợp chúng tôi không kiểm soát tất cả bộ điều khiển chế độ xem trước đó (tức là nếu chúng tôi đang làm việc trong một khuôn khổ), chúng tôi có thể xóa tiêu đề của nút quay lại như sau:

// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()

// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil

Những gì nó làm là điều hướng đến mục cuối cùng của ngăn xếp của điều hướng và xóa tiêu đề phía sau của nó. Đảm bảo lưu bản gốc khi bộ điều khiển chế độ xem của chúng tôi xuất hiện:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
    // Delete title somewhere here...
}

và sau đó gán lại nó, để không làm gián đoạn bất kỳ phần nào của ứng dụng:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}

0

Điều này sẽ giải quyết vấn đề của bạn:

    import UIKit

    extension UINavigationController{

    func customizeBackArrow(){
        let yourBackImage = UIImage(named: "icon_back_arrow")
        self.navigationBar.backIndicatorImage = yourBackImage
        self.navigationBar.tintColor = Common.offBlackColor
        self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        navigationItem.leftItemsSupplementBackButton = true
        self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", 
           style: .plain, target: self, action: nil)

    }
}

0

Tôi đã thử một vài câu trả lời và tôi không thể làm cho chúng hoạt động trong mọi trường hợp. Vì vậy, đây là một giải pháp để không ảnh hưởng đến tiêu đề của thanh điều hướng nếu nó được đặt.

    guard let items = viewController.navigationController?.navigationBar.items else { return }
    for item in items {
        if item.title == nil {
            item.title = ""
        }
    }

0

Cách lập trình dễ dàng, không có tác dụng phụ không mong muốn, là khởi tạo navigationItem.backBarButtonItem với một mục trống trong phương thức AwakeFromNib của bộ điều khiển nguồn ( phương thức bạn đang điều hướng từ đó):

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

Lưu ý: Nếu bạn khởi tạo nút quay lại sau đó, như trong phương thức viewDidLoad () , bạn sẽ mất chức năng vuốt ngược lại (vuốt từ cạnh trái sang phải sẽ đưa bạn lùi lại một bước trong ngăn điều hướng).

Sau đó, nếu bạn muốn các văn bản nút quay lại khác nhau cho các bộ điều khiển đích khác nhau và nếu bạn đang sử dụng segues, bạn có thể đặt tiêu đề trong phương thức chuẩn bị (cho segue :, sender :) , như sau:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let item = navigationItem.backBarButtonItem {
        switch segue.identifier {
        case "SceneOne": item.title = "Back"; break
        case "SceneTwo": item.title = "Home"; break
        case "SceneThree": item.title = nil; break // Use this scene's title
        default: item.title = "" // No text
        }
    }
}
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.