Как установить текст кнопки возврата в Swift

207

Как убрать текст кнопки назад.

Текущая кнопка возврата:

<Назад

Желаемая кнопка назад:

<AnythingElse

Ни один из них не работал:

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
Onichan
источник

Ответы:

604

Кнопка «Назад» принадлежит предыдущему контроллеру представления, а не тому, который в данный момент представлен на экране.
Чтобы изменить кнопку «Назад», вы должны обновить ее перед нажатием на контроллере представления, который инициировал переход:

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
}

Свифт 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
}

ИЛИ

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)
Ярив Ниссим
источник
9
Большое спасибо, вы не знаете, сколько часов я потратил только на эту маленькую деталь (предыдущий контроллер)
Рикардо,
3
Если бы я мог поднять голос миллион раз, я бы. Не могу сказать, сколько времени я потратил на то, чтобы понять, почему он не работает (раньше был на контроллере назначения)
Дилан Ирландия,
13
«Кнопка« Назад »принадлежит предыдущему контроллеру представления» - это самый ценный ответ, который я нашел об этой теме! Спасибо!
вхристосков
1
Установка titleизменений заголовка , а не только кнопки назад.
Ярив Ниссим
4
Я добавил self.navigationController .navigationBar.topItem .backBarButtonItem = backItem вместо navigationItem.backBarButtonItem = backItem и она отлично работает на Swift 3. Спасибо!
Индра Адам
125

Вы можете сделать это из конструктора интерфейса следующим образом:

нажмите на элемент навигации предыдущего контроллера представления

введите описание изображения здесь

из инспектора атрибутов установите текст кнопки «Назад» на то, что вы хотите. Это оно!!

введите описание изображения здесь

Аджинкя Патил
источник
1
Какой лучший способ присвоить ноль?
Kennydust
@kennydust Вы имеете в виду пустой заголовок?
Аджинкья Патил
8
@kennydust yes в кнопке «Назад» добавьте пробел и нажмите «
Ввод»
Красиво и легко, но локализуемо ли это?
Gruntcakes
2
@AjinkyaPatil Я пробовал это, но кнопка Назад не появляется. Любая причина, почему это может быть?
user805981
48

Текст кнопки «Назад» берется из заголовка элемента навигации родительского view-контроллера. Таким образом, все, что вы установили в заголовке элемента навигации предыдущего view-контроллера, будет отображаться в тексте кнопки возврата текущего view-контроллера. Вы можете просто поставить "" в качестве заголовка элемента навигации в методе viewWillAppear родительского контроллера представления.

self.navigationItem.title = ""

Другой способ поставить

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

в текущем представлении контроллера метод viewWillAppear. Это вызовет другую проблему, если стек навигации слишком вложен.

minhazur
источник
5
self.navigationItem.title = "" должен быть сверху как лучший ответ!
Rilar
Я согласен с этим, так как это лучший ответ, потому что все ответы, приведенные выше, требуют добавления целевой функции к элементу навигации, поэтому они не просто изменяют текст, но и добавляют собственную функцию всплывающего окна, которая не требуется для вопроса!
IsPha
Это прекрасно работает в том prepareForSegue, что есть. немного чище, потому что вы не изменяете новый viewController после его загрузки.
Адриан
Обращать внимание!!! положить self.title = "....." перед вызовом self.navigationItem.title = ""
Бари Леви
45

Вы можете поместить эти 3 строки кода вViewController что хотите изменить заголовок кнопки «Назад».

По вашему override func viewDidLoad() {}.

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
Хитеш Чаухан
источник
2
Это решение кажется более правильным, поскольку вы помещаете логику в прибывающий ВК, а не в тот, из которого вы уходите. Ака: читает лучше.
эонист
37

Если вы используете файл xib для контроллера представления, сделайте это в своем классе контроллера представления.

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
}

}

Результат будет:

введите описание изображения здесь

Mustaq
источник
29

Я не знаю, где вы использовали свои методы, которые вы задали для своего вопроса, но я мог бы получить желаемый результат, если бы использовал в своем ViewControllerклассе (в котором я хочу изменить кнопку возврата) viewDidLoad()следующую функцию:

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

Результат будет:

Перед

введите описание изображения здесь

После

введите описание изображения здесь

Франсиско Ромеро
источник
3
В моем случае это работает, только если вы поместите этот кусок кода в метод viewDidAppear, а не в viewDidLoad
apinho
2
Используйте navigationController.navigationBar.topItem?.title = ""вместо этого, чтобы избежать этогоviewDidAppear
Хосе
Это кажется наиболее удовлетворительным способом и позволяет избежать вспышки, поскольку название кнопки «Назад» изменяется на «» с помощью self.navigationItem.title = «» в вызывающем контроллере (более медленные устройства). Кроме того, другая ситуация, когда self.navigationItem.title = "" полностью игнорируется, периодически переходит быстро в контроллер представления через программный переключатель вкладок контроллера вкладок.
FlimFlam Vir
22

Кнопка «Назад» принадлежит предыдущему контроллеру представления, а не тому, который в данный момент представлен на экране. Чтобы изменить кнопку «Назад», вы должны обновить ее перед нажатием, добавить viewdidload:

Свифт 4:

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)
Мохаммед Разипур
источник
12

Вы можете просто изменить NavigationItem в раскадровке

введите описание изображения здесь

В кнопку «Назад» добавьте пробел и нажмите Enter.

Примечание: сделайте это в предыдущем ВК.

xhinoda
источник
8

Swift 4 - настройте кнопку возврата, прежде чем нажимать какие-либо контроллеры вида

// 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)
budidino
источник
8

Это должно работать:

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)
}

Хотя это и не рекомендуется, поскольку фактически заменяет кнопку BackButton, а также убирает стрелку назад и жест смахивания.

Деян Скледар
источник
10
не правильный способ сделать это, вы просто заменяете кнопку «назад»
Ярив Ниссим
Лучше сделать это из конструктора интерфейса
Рутгер Хейсманс
7

Swift 4.2

Если вы хотите изменить текст элемента кнопки «Назад» на панели навигации, поместите его в viewDidLoadконтроллер ДО того, где отображается кнопка «Назад», а НЕ в контроллер представления, где видна кнопка «Назад».

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

Если вы хотите изменить текущий текст заголовка панели навигации, используйте приведенный ниже код (обратите внимание, что он становится задним текстом по умолчанию для СЛЕДУЮЩЕГО представления, переданного на контроллер навигации, но этот задний текст по умолчанию может быть переопределен приведенным выше кодом)

 self.title = "Navigation Bar Title"
Икбал
источник
6

Есть два способа.

1. В предыдущем ViewController.viewDidLoad ()

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

2. В currentViewController.viewDidAppear ()

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

Причина: backButtonпроисходит от navigationBar.backItem.backBarButtonItem, так что первый путь obvious.In currentViewController.viewDidLoad (), мы не можем получить ссылку на backItem, потому что в viewDidAppear (), то navigationBarтолкнул navigationViewна ИТС stack.so мы можем внести изменения в backItemв currentViewController. viewDidAppear ()

Для более подробной информации, вы можете увидеть документ: UINavigationBar

Calcifer
источник
3

В viewDidLoadспособе представления контроллера добавьте:

// hide navigation bar title in the next controller
let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton
Клаус
источник
2

хотя эти ответы решают проблему, но это может быть полезным

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

В то время как предыдущая поговорка «подготовиться к переходу» верна и верна, кнопка «Назад» принадлежит предыдущему VC, она просто добавляет кучу ненужного кода.

Лучше всего установить заголовок текущего VC в viewDidLoad, и он автоматически установит заголовок кнопки возврата на следующем VC. Эта линия работала для меня

navigationController?.navigationBar.topItem?.title = "Title"
Joel
источник
2

Это работает для Swift 5 :

self.navigationItem.backBarButtonItem?.title = ""

Пожалуйста, обратите внимание, что это будет эффективно для следующего контроллера просмотра, а не текущего на дисплее, поэтому это очень сбивает с толку!

Также проверьте раскадровку и выберите элемент навигации предыдущего контроллера представления, затем введите что-нибудь в кнопку «Назад» (Инспектор).

Саид Ир
источник
1

Попробуйте это ... это будет работать ....

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

Приведенный выше код скроет текст и покажет только стрелку назад на панели навигации.

Сарабджит Сингх
источник
0

Установите self.title = "" до 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
}

Надеюсь, поможет!! #swift 3

Сатиш Кумар Гурунатхан
источник
0

Если вы нажимаете контроллер представления со страницы контроллера просмотра страниц, вы не можете обновить заголовок кнопки возврата контроллера навигации. Чтобы решить эту проблему, создайте делегат обратно в ваш родительский контроллер представления (вы также можете пройти через иерархию контроллера представления обратно до родительского).

Кроме того, кнопки «Назад» имеют ограничение по количеству символов. Если вы превысите этот предел символов, система по умолчанию будет «Назад». Это не будет усекать для вас. Например:

backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.
Джастин Домниц
источник
0

Swift 4

В моем случае решение состояло в том, чтобы очистить элемент навигации Master View Controller, прежде чем переходить к Child View Controller. И установите его снова, если он будет показан снова

MasterController

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

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

И вот как я нажимаю UIViewController и очищаю элемент кнопки задней панели в дочернем контроллере:

MasterController

let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
childController.navigationItem.backBarButtonItem?.title = ""
navigationController?.pushViewController(childController, animated: true)
Хорхе Касариего
источник
0

для Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem
Ирина Батвина
источник
0

GOTCHA: Если у вас возникли проблемы с любым из многих снимались предложения, убедитесь , что вы зарегистрировав UITableViewCellс в viewDidLoad(), а не отinit()

Уомбл
источник
-1

Решение проверено и работает в Swift 5

Ниже я приведу несколько решений для разных случаев:

1. Удалить текст с кнопки назад

Лучшее решение для удаления текста с кнопки «назад» - добавить в viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Установить собственный текст на кнопку назад

Если вы хотите установить свой собственный заголовок, сделайте это, установив заголовок backButton:

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

3. Пустая кнопка возврата на всех ВК

Если вы хотите создать общий стиль во всем приложении - чтобы у вас была только стрелка назад без текста, создайте базовый VC для всех ваших контроллеров представления:

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

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

Решение, представленное выше, позволяет вам настроить кнопку «Назад» в будущем, если вы хотите сделать какое-то исключение позже, добавив дополнительную переменную и переопределив ее в определенном ViewController, 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
    }
}
lukszar
источник
-2

Свифт 4

есть один способ изменить текст в backButton программно из текущего viewController:

navigationController?.navigationBar.items![0].title = "some new text"
zslavman
источник