Программное изменение заголовка навигации

192

У меня есть панель навигации с заголовком. Когда я дважды щелкаю текст, чтобы переименовать его, он на самом деле говорит, что это элемент навигации, так что это может быть так.

Я пытаюсь изменить текст с помощью кода, например:

declare navigation bar as navagationbar here
button stuff {
    navigationbar.text = "title"
}

Очевидно, это не мой код, я просто показываю, как он будет работать.

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

Рост
источник

Ответы:

556

Вы меняете заголовок, изменяя заголовок отображаемого контроллера представления:

viewController.title = "some title"

Обычно это делается с учетом загрузки контроллера представления:

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "some title"
}

Однако это работает только в том случае, если ваш контроллер представления встроен в UINavigationController. Я настоятельно рекомендую сделать это вместо того, чтобы создавать панель навигации самостоятельно. Если вы настаиваете на создании панели навигации самостоятельно, вы можете изменить заголовок, выполнив следующие действия:

navigationBar.topItem.title = "some title"
Дрюаг
источник
1
ViewController.type не имеет члена с именем title. Это ошибка, которую я получаю.
Повышение
2
Вы не называете это прямо в классе. Вы вызываете это в экземпляре подкласса UIViewController
drewag
Да, ViewControllerотносится к самому классу. Вам необходимо обратиться к примеру из ViewController. Изнутри метода вашего класса, например viewDidLoad, вы можете сделать это, используя self. Если вы не знаете разницы между классом и экземпляром, я настоятельно рекомендую вам узнать, что это такое. Эта статья поможет.
drewag 06
Работает как шарм и в Xcode ... небольшое изменение -> self.title = @ "some title";
Аннотация
self.title = "some title" у меня сработало. Спасибо ! Я пробовал 'navigationController? .NavigationItem.title = "Какой-то заголовок". действительно не уверен, почему это не работает. (У меня там есть элемент навигации, который я разместил для отображения заголовка, в дополнение к встроенному контроллеру навигации). Я все еще думаю, что это должно работать, но не знаю почему. И снова на помощь приходит Stack overflow!
Naishta 08
70

Попробуйте следующее в viewDidLoad

self.navigationItem.title = "Your Title"
Ави
источник
1
Работай на меня. iOS 11.4
Энтони Вонг
14

Приведенный ниже код работает для меня с Xcode 7:

override func viewDidLoad() {        
    super.viewDidLoad()
    self.navigationItem.title = "Your Title"
}
grmonkeybiz
источник
10

Я обнаружил, что это работает:

navigationItem.title = "Title"
AJ9
источник
Как вы центрируете заголовок в контроллере представления, который является дочерним элементом UINavigationController? Почему-то текст выровнен по левому краю. var customTitle = self.navigationController?.visibleViewController?.navigationItem customTitle?.title = "Some Title"
bibscy
5

а также, если вы попытаетесь создать Navigation Barвручную, этот код поможет вам

func setNavBarToTheView() {
    let navBar: UINavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 64.0))
    self.view.addSubview(navBar);
    let navItem = UINavigationItem(title: "Camera");
    let doneItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.cancel, target: self, action: #selector(CameraViewController.onClickBack));
    navItem.leftBarButtonItem = doneItem;
    navBar.setItems([navItem], animated: true);
}
Алексей Тимощенко
источник
4

Обычно лучше всего устанавливать заголовок на UIViewController. При этом UINavigationItemтакже устанавливается. Как правило, это лучше, чем программное выделение и инициализацияUINavigationBar который ни с чем не связан.

Вы упускаете некоторые преимущества и функциональные возможности, для которых он UINavigationBarбыл разработан. Вот ссылка на документацию, которая может вам помочь. В нем обсуждаются различные свойства, которые вы можете установить на фактическом баре и наUINavigationItem .

Только имейте в виду:

  1. Вы теряете функциональность кнопки возврата (если не подключите ее самостоятельно)
  2. Встроенный жест "перетащить с левой стороны, чтобы провести назад" не работает.

UINavigationControllerэто твои друзья.

закодированный
источник
4

Правильный ответ для людей, использующих было бы

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.title = "Your Text"
}
Кевин Сингх
источник
3

Swift 3

Я создал выход для элемента строки заголовка навигации, который поставляется с панелью навигации (из обозревателя объектов) в раскадровке. Затем я подал в суд на следующую строку:

navigationBarTitleItem.title = "Hello Bar"
nyxee
источник
2

Если у вас есть NavigationControllerвстроенный элемент, TabBarControllerсм. Ниже:

super.tabBarController?.title = "foobar"

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

Вы можете отлаживать подобные проблемы с помощью сценариев отладчика. Попробуйте команду Chisel, pvc чтобы распечатать все видимые / скрытые представления в иерархии.

ржавыймагнит
источник
2

Если вы хотите изменить заголовок из дочернего контроллера представления контроллера представления страницы, встроенного в контроллер навигации, это будет выглядеть так:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.parent?.title = "some title"
}
Francojamesfan
источник
0

В Swift 4:

Swift 4

override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "Your title"
}

Надеюсь, это поможет, привет!

Радамес Э. Эрнандес
источник
2
Это лишь половина принятого ответа. Кроме того, если вы говорите, что ничего не изменилось, то зачем вам что-то публиковать ?! Пожалуйста, удалите.
Эрик Айя
@ Мориц, ты модератор или что-то в этом роде? Если сказать «Да», я удалю его, если нет - не удалю.
Радамес Э. Эрнандес
1
Ты правда это говоришь? Надо мной 4 совершенно одинаковых ответа, тогда почему ты идёшь со мной и приказываешь стереть мой? Я надежный пользователь, который поддерживает сообщество, я не собираюсь просто повторять ответы. Я просто хотел обновить этот вопрос с помощью обновленной быстрой версии.
Радамес Э. Эрнандес
3
В вашем ответе ничего не обновлено. Это тот же код, что и принятый ответ, часть «Обычно это делается с учетом загрузки» ...
Эрик Айя
0

Я предпочитаю использовать self.navigationItem.title = "Your Title Here"over self.title = "Your Title Here"для указания заголовка на панели навигации, поскольку панель вкладок также используется self.titleдля изменения заголовка. Вам следует попробовать следующий код один раз.

Примечание: вызов жизненного цикла суперпредставления необходим перед выполнением каких-либо действий.

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

private func setupNavBar() {
    self.navigationItem.title = "Your Title Here"
}
Мукеш Шакья
источник
0

Swift 5.1

override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.title = "What ever you want"
}
Марлхекс
источник
0

Swift 5.1

// Установить название панели навигации программно и динамически

Примечание: сначала добавьте NavigationControllerItem в свой, ViewControllerзатем перейдите к их ViewController.swiftфайлу и просто скопируйте и вставьте его viewDidLoad().

navigationItem.title = "Your Title Here"

Ракша.
источник