2016-08-21 3 views
1

В связи с этим вопросом: How to change Back button text from within the child view controller? Я ищу подходящий способ обновить панель навигации после изменения названия кнопки с previousViewController.navigationItem.backBarButtonItem?.title = "New Title".Как правильно обновить UINavigationBar?

The (не так идеально?) Решение от связанного вопроса:

if let navigationController = self.navigationController { 
    navigationController.popViewControllerAnimated(false) 
    navigationController.pushViewController(self, animated: false) 
} 

Edit:

Видимо меняется кадр слоя заставляет панель навигации, чтобы обновить. (?) Не является решением, но менее дорогой обходного пути я думаю:

if let navigationController = self.navigationController { 
    navigationController.navigationBar.layer.frame.insetInPlace(dx: 0.1, dy: 0) 
    navigationController.navigationBar.layer.frame.insetInPlace(dx: -0.1, dy: 0) 
} 
+0

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

+0

В некоторых ситуациях изменение названия улучшает работу пользователя. Возьмем WhatsApp в качестве примера. – MJQZ1347

+0

Предположим, я никогда не использовал WhatsApp. – nhgrif

ответ

0

Одним из решений будут иметь функцию, которая изменяет UIBarButtonItem полностью путем удаления/скрытия кнопки назад и показывая обычай UIBarButtonItem в его место с navigationItem.leftBarButtonItem собственности. Наверняка не идеальный, но кнопка не предназначена для изменения жизненного цикла среды VC, поэтому, я думаю, вы могли бы попробовать. В этом смысле нет «правильного» способа, поскольку это не считается стандартным поведением.

Он работал для меня, когда я добавил эту функцию к кнопке на Sample View Controller:

func changeBackButton() { 
    navigationItem.hidesBackButton = true 
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Test", style: .plain, target: self, action: #selector(test)) 
} 
+0

Но как насчет стрелки назад? Это отсутствует? – MJQZ1347

+0

@ MJQZ1347 Просто добавьте «<» в заголовок и поиграйте со шрифтом? Или проверьте это: http://stackoverflow.com/a/18874211/6597361 Но в любом случае это очень простой выход из вашей ситуации. – tech4242

+0

К сожалению, салфетки для возврата не работают с этим обходным путем. Также должен быть более простой способ обновить навигационную панель без появления VC? – MJQZ1347

3

После попытки различных методов обновления, я считаю, что это наименее некрасиво решение, которое, кажется, работает (в крайней мере, на 10 прошивкой):

guard let navigation = navigationController, 
     !(navigation.topViewController === self) else { 
    return 
} 
let bar = navigation.navigationBar 
bar.setNeedsLayout() 
bar.layoutIfNeeded() 
bar.setNeedsDisplay() 

Другие методы пытались:

  • Представляя контроллер представления (причины экран мерцать в некоторых случаях)
  • Скрытие и вновь показывая бар (перерывы бар, если на полпути между backswipe к предыдущим VC)
  • Установка кадра слоя адвокатуры в (кажется, не надежно работать, и это явно запрещено по документации для navigationBar)