Cách đặt lại văn bản nút trong Swift


207

Làm thế nào để bạn loại bỏ văn bản nút trở lại.

Nút quay lại hiện tại:

<Quay lại

Nút quay lại mong muốn:

<Bất cứ điều gì

Không ai trong số này đã làm việc:

self.navigationItem.backBarButtonItem?.title = "Back"
self.backItem?.title = ""
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationItem.backBarButtonItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title="Back"
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title

Câu trả lời:


604

Nút quay lại thuộc về bộ điều khiển xem trước đó , không phải nút hiện đang hiển thị trên màn hình.
Để sửa đổi nút quay lại, bạn nên cập nhật nó trước khi ấn, trên trình điều khiển xem đã khởi tạo segue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

Swift 3, 4 & 5:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

HOẶC LÀ

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)

9
Cảm ơn rất nhiều, bạn không biết tôi đã dành bao nhiêu giờ cho chi tiết nhỏ đó (bộ điều khiển trước đó)
Ricardo

3
Nếu tôi có thể nâng cao một triệu lần tôi sẽ làm. Không thể cho bạn biết tôi đã mất bao lâu để tự hỏi tại sao nó không hoạt động (trước đây là trên bộ điều khiển đích)
Dylan Ireland

13
"Nút quay lại thuộc về bộ điều khiển xem trước" đó là câu trả lời có giá trị nhất mà tôi đã tìm thấy về chủ đề này! Cảm ơn bạn!
vhristoskov

1
Đặt titlethay đổi tiêu đề , không chỉ nút quay lại.
Yariv Nissim

4
Tôi thêm self.navigationController .navigationBar.topItem .backBarButtonItem = backItem thay vì navigationItem.backBarButtonItem = backItem và nó hoạt động tốt trên Swift 3. Cảm ơn bạn!
Indra Adam

125

Bạn có thể làm điều đó từ trình xây dựng giao diện như sau:

nhấp vào mục điều hướng của bộ điều khiển xem trước

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

từ trình kiểm tra thuộc tính đặt văn bản nút quay lại thành bất cứ điều gì bạn muốn. Đó là nó!!

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


1
cách tốt nhất để gán 'nil' là gì?
kennydust

@kennydust Ý bạn là tiêu đề trống?
Ajinkya Patil

8
@kennydust có trong nút quay lại thêm khoảng trắng và nhấn enter
Ajinkya Patil

Đẹp và dễ dàng, nhưng nó có thể bản địa hóa?
Gruntcakes

2
@AjinkyaPatil Tôi đã thử cách này nhưng nút Quay lại không hiển thị. Bất kỳ lý do tại sao điều này có thể được?
user805981

48

Văn bản nút quay lại được lấy từ tiêu đề mục điều hướng của trình điều khiển xem cha. Vì vậy, bất cứ điều gì bạn đặt trên tiêu đề mục điều hướng của trình điều khiển chế độ xem trước đó, sẽ được hiển thị trên văn bản nút quay lại của trình điều khiển chế độ xem hiện tại. Bạn chỉ có thể đặt "" làm tiêu đề mục điều hướng trong phương thức viewWillAppear của trình điều khiển cha.

self.navigationItem.title = ""

Một cách khác là đặt

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

trong phương thức viewWillAppear của trình điều khiển xem hiện tại. Điều này sẽ gây ra một số vấn đề khác nếu ngăn xếp điều hướng quá lồng nhau.


5
self.navlationItem.title = "" nên được đặt lên hàng đầu là câu trả lời hay nhất!
vui vẻ

Tôi đồng ý với điều này vì câu trả lời tốt nhất vì tất cả các câu trả lời ở trên đều yêu cầu thêm chức năng đích vào mục điều hướng, vì vậy chúng không chỉ thay đổi văn bản mà còn thêm chức năng pop tùy chỉnh, câu hỏi không bắt buộc!
IsPha

Điều này hoạt động tốt trong prepareForSegue, đó là. sạch hơn một chút vì bạn không thay đổi viewContoder mới sau khi tải.
Adrian

Chú ý!!! đặt self.title = "....." trước khi gọi tới self.navlationItem.title = ""
Bary Levy

45

Bạn có thể đặt 3 dòng mã này vào phầnViewController bạn muốn thay đổi tiêu đề nút quay lại.

Trong của bạn override func viewDidLoad() {}.

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

2
Giải pháp này có vẻ đúng hơn, khi bạn đặt logic vào VC đến chứ không phải VC bạn đang rời đi. Aka: đọc tốt hơn.
eonist

37

Nếu bạn đang sử dụng tệp xib cho trình điều khiển xem thì hãy làm điều này trong lớp trình điều khiển xem của bạn.

class AboutUsViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    edgesForExtendedLayout = []
    setUpNavBar()
}

func setUpNavBar(){
    //For title in navigation bar
    self.navigationController?.view.backgroundColor = UIColor.white
    self.navigationController?.view.tintColor = UIColor.orange
    self.navigationItem.title = "About Us"

    //For back button in navigation bar
    let backButton = UIBarButtonItem()
    backButton.title = "Back"
    self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
}

}

Kết quả sẽ là:

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


29

Tôi không biết bạn đã sử dụng phương pháp nào mà bạn đặt câu hỏi nhưng tôi có thể nhận được kết quả mong muốn nếu tôi sử dụng, trên ViewControllerlớp của tôi (trong đó tôi muốn thay đổi nút quay lại), trên viewDidLoad()chức năng, dòng sau:

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

Kết quả sẽ là:

Trước

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

Sau

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


3
Trong trường hợp của tôi, nó chỉ hoạt động nếu bạn đặt đoạn mã này vào phương thức viewDidAppear chứ không phải viewDidLoad one
apinho

2
Sử dụng navigationController.navigationBar.topItem?.title = ""thay thế để tránh đưa cái này vàoviewDidAppear
Jose

Đây có vẻ là cách thỏa đáng nhất và tránh đèn flash khi tiêu đề nút quay lại được đổi thành "" bằng cách sử dụng self.navlationItem.title = "" trong bộ điều khiển cuộc gọi (thiết bị chậm hơn). Ngoài ra, tình huống khác trong đó self.navlationItem.title = "" hoàn toàn bị bỏ qua chuyển đổi nhanh chóng vào bộ điều khiển chế độ xem thông qua một tab điều khiển tab theo chương trình.
FlimFlam Vir

22

Nút quay lại thuộc về bộ điều khiển xem trước đó, không phải nút hiện đang hiển thị trên màn hình. Để sửa đổi nút quay lại, bạn nên cập nhật nó trước khi đẩy, thêm viewdidload:

Swift 4:

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

12

Bạn chỉ có thể sửa đổi NavigationItem trong bảng phân cảnh

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

Trong nút Quay lại thêm một khoảng trắng và nhấn Enter.

Lưu ý: Làm điều này trong VC trước.


8

Swift 4 - Định cấu hình nút quay lại trước khi đẩy bất kỳ bộ điều khiển xem nào

// if you want to remove the text
navigationItem.backBarButtonItem = UIBarButtonItem()

// if you want to modify the text to "back"
navigationItem.backBarButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)

8

Điều này sẽ làm việc:

override func viewDidLoad() {
    super.viewDidLoad()

    var button = UIBarButtonItem(title: "YourTitle", style: UIBarButtonItemStyle.Bordered, target: self, action: "goBack")
    self.navigationItem.backBarButtonItem = button

}

func goBack()
{
    self.navigationController?.popViewControllerAnimated(true)
}

Mặc dù nó không được khuyến khích vì điều này thực sự thay thế backButton và nó cũng loại bỏ mũi tên quay lại và cử chỉ vuốt.


10
không phải là cách đúng đắn để làm điều đó, bạn chỉ cần thay thế nút quay lại
Yariv Nissim

Tốt hơn để làm điều đó từ trình xây dựng giao diện
Rutger Huijsmans

7

Swift 4.2

Nếu bạn muốn thay đổi văn bản mục của nút điều hướng trở lại, hãy đặt phần này vào trong viewDidLoadbộ điều khiển TRƯỚC cái mà nút quay lại hiển thị, KHÔNG trên bộ điều khiển xem nơi có thể nhìn thấy nút quay lại.

 let backButton = UIBarButtonItem()
 backButton.title = "New Back Button Text"
 self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

Nếu bạn muốn thay đổi văn bản tiêu đề của thanh điều hướng hiện tại, hãy sử dụng mã bên dưới (lưu ý rằng điều này trở thành văn bản trở lại mặc định cho chế độ xem NEXT được đẩy lên bộ điều khiển điều hướng, nhưng văn bản trở lại mặc định này có thể bị ghi đè bởi mã ở trên)

 self.title = "Navigation Bar Title"

6

Có hai cách.

1. Trong phần trướcViewControll.viewDidLoad ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"
navigationItem.backBarButtonItem = backBarBtnItem

2.Trong currentViewControll.viewDidAppear ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"      
navigationController?.navigationBar.backItem?.backBarButtonItem = backBarBtnItem

Lý do: các backButtonxuất phát từ navigationBar.backItem.backBarButtonItem, vì vậy cách đầu tiên là obvious.In currentViewController.viewDidLoad (), chúng ta không thể có được tài liệu tham khảo của backItem, bởi vì trong viewDidAppear () thì navigationBarđẩy navigationViewvào nó stack.so chúng ta có thể thay đổi cácbackItem trong currentViewController. viewDidAppear ()

Để biết thêm chi tiết, bạn có thể xem Tài liệu: UINavestionBar


3

Trong viewDidLoadphương thức của trình điều khiển trình bày thêm:

// hide navigation bar title in the next controller
let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton

2

Mặc dù những câu trả lời này khắc phục vấn đề nhưng điều này có thể hữu ích

class MainNavigatioController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        // first
        let backItem = UIBarButtonItem()
        backItem.title = "رجوع"
        self.viewControllers.last?.navigationItem.backBarButtonItem = backItem
        // then
        super.pushViewController(viewController, animated: animated)

    }

}

2

Swift 4

Mặc dù câu nói trước để chuẩn bị cho segue là chính xác và đúng là nút quay lại thuộc về VC trước đó, nhưng nó chỉ cần thêm một loạt mã không cần thiết.

Điều tốt nhất cần làm là đặt tiêu đề của VC hiện tại trong viewDidLoad và nó sẽ tự động đặt tiêu đề nút quay lại chính xác trên VC tiếp theo. Dòng này làm việc cho tôi

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

2

Điều này hoạt động cho Swift 5 :

self.navigationItem.backBarButtonItem?.title = ""

Xin lưu ý rằng nó sẽ có hiệu quả đối với bộ điều khiển xem đẩy tiếp theo chứ 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 trình đ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

Hãy thử điều này ... nó sẽ hoạt động ....

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.title = ""
}

Đoạn mã trên sẽ ẩn văn bản và chỉ hiển thị mũi tên lùi trên thanh điều hướng.


0

Đặt self.title = "" trước self.navigationController?.pushViewController(vc, animated: true).


0
override func viewWillAppear(_ animated: Bool) {

    self.tabBarController?.navigationItem.title = "Notes"

    let sendButton = UIBarButtonItem(title: "New", style: .plain, target: self, action: #selector(goToNoteEditorViewController))

    self.tabBarController?.navigationItem.rightBarButtonItem = sendButton
}

func goToNoteEditorViewController(){
   // action what you want
}

Hy vọng nó giúp!! #swift 3


0

Nếu bạn đang đẩy bộ điều khiển xem từ trang điều khiển xem trang, bạn không thể cập nhật tiêu đề nút quay lại của bộ điều khiển điều hướng. Để giải quyết vấn đề này, hãy tạo một ủy nhiệm trở lại cho trình điều khiển khung nhìn cha mẹ của bạn (bạn cũng có thể duyệt qua hệ thống phân cấp của trình điều khiển xem sao lưu đến cha mẹ).

Hơn nữa, các nút Quay lại có giới hạn ký tự. Nếu bạn vượt quá giới hạn ký tự đó, hệ thống sẽ mặc định là "Quay lại". Nó sẽ không cắt ngắn cho bạn. Ví dụ:

backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.

0

Swift 4

Trong trường hợp của tôi, giải pháp là xóa mục điều hướng của Bộ điều khiển Chế độ xem chính trước khi chuyển sang Bộ điều khiển Chế độ xem trẻ em. Và đặt lại nếu nó được hiển thị lại

MasterContoder

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

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

Và đây là cách tôi đẩy một UIViewContoder và xóa mục nút thanh phía sau trong trình điều khiển con:

MasterContoder

let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
childController.navigationItem.backBarButtonItem?.title = ""
navigationController?.pushViewController(childController, animated: true)

0

cho Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem

0

Ghi chú: Nếu bạn đang gặp rắc rối với bất kỳ của nhiều đóng vai chính đề nghị, đảm bảo rằng bạn đang đăng ký của bạn UITableViewCells trong viewDidLoad(), không phải từinit()


-1

Đã kiểm tra giải pháp và hoạt động trong Swift 5

Dưới đây tôi đặt một vài giải pháp cho các trường hợp khác nhau:

1. Xóa văn bản khỏi nút quay lại

Giải pháp tốt nhất để xóa văn bản khỏi nút quay lại là thêm vào viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Đặt văn bản riêng trên nút quay lại

Trong trường hợp bạn muốn đặt tiêu đề của riêng mình, hãy thực hiện bằng cách đặt tiêu đề của backButton:

let backButton = UIBarButtonItem()
backButton.title = "My Title"
navigationItem.backBarButtonItem = backItem

3. Nút quay lại trống trên tất cả các VC

Nếu bạn muốn tạo kiểu chung trong toàn bộ ứng dụng - chỉ cần quay lại mũi tên mà không có văn bản, hãy tạo VC cơ sở cho tất cả Bộ điều khiển xem của bạn:

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

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

Giải pháp được trình bày ở trên cho phép bạn tùy chỉnh nút quay lại trong tương lai nếu bạn muốn tạo một số ngoại lệ sau này, bằng cách thêm biến bổ sung và ghi đè nó trong ViewContoder cụ thể, f.ex:

class BaseViewController: UIViewController {

    var customBackButtonTitle: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        var backButton = UIBarButtonItem()
        if let text = customBackButtonTitle {
            backButton.title = text
        }
        navigationItem.backBarButtonItem = backButton
    }
}

-2

nhanh 4

có một cách để thay đổi văn bản trong backButton theo lập trình từ chế độ xem hiện tại:

navigationController?.navigationBar.items![0].title = "some new 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.