2016-08-21 3 views
0

Я знаю, что вы можете установить заголовок кнопки возврата из IB или prepareForSegue, но в моем приложении мне нужно обновить заголовок в соответствии с событиями, которые могут произойти, пока контроллер виден.Как изменить текст кнопки «Назад» внутри контроллера дочернего представления?

Я пытался, но ничего не происходит:

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

Это работает, хотя, но не имеет стрелку назад:

self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: title, style: .Plain, target: nil, action: "popVC")

Есть идеи?

ответ

1

backBarButtonItem является элементом, используемым для кнопки возврата next контроллер в стеке навигации.
Так, например, если у вас есть контроллер навигации с корневым viewController A, и вы нажимаете viewController B, то нажатие кнопки назад, которое вы видите после нажатия B, настраивается с использованием A.

Вы могли бы что-то вроде этого:

A.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Go back to A", style: .Plain, target: nil, action: nil) 

После B нажат, вы увидите кнопку назад с «Назад к А».

В вашем случае сложной частью является найти A в стеке навигации от B. Вы можете сделать это с помощью функции поиска в viewControllers в navigationController как так:

// This code works from the `B` view controller 
let viewControllers = self.navigationController?.viewControllers ?? [] 
if let indexOfCurrent = viewControllers.indexOf(self) where (indexOfCurrent > viewControllers.startIndex) { 
    let indexOfPrevious = indexOfCurrent.advancedBy(-1) 
    let previousViewController = viewControllers[indexOfPrevious] 
    previousViewController.navigationItem.backBarButtonItem?.title = "New Title" 
} 

Редактировать

Я не знаю ни одного чистого способа обновить панель навигации после этого. Возможно, вы могли бы задать отдельный вопрос только для этого.
Что вы можете сделать, это поп и нажать на контроллер представления без анимации

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

Или, может попытаться создать новый UIBarButtonItem вместо изменения названия существующего.

+0

Но, как зачеркнуто в моем queestion, название кнопки может измениться после нажатия кнопки B. Он должен работать как WhatsApp, где кнопка назад в контроллере просмотра чата обновляется с количеством новых сообщений чата. Мне любопытно, как им это удалось? – MJQZ1347

+0

Я нажал публикацию по ошибке ... См. Мое редактирование – deadbeef

+0

Спасибо, попробовал это. Кажется, что это работает, но только после того, как 'B' был открыт и снова открывается. Есть ли способ обновить 'navigationBar'? – MJQZ1347

0

попробовать это:

let baritems = self.navigationController?.navigationBar.items 

     for item in baritems!{ 
      if (item.leftBarButtonItem != nil){ 
       item.title = "123" 
      } 
     } 
0

Этот вопрос довольно старый, но я была проблема изменения текста кнопки назад, основываясь на выбранной ячейке вложенной tableViewController в.

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

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

let vcs = navigationController?.viewControllers 
vcs?[(vcs?.count)! - 2].navigationItem.title = "Your Text Here" 

Предполагая, что наш текущий контроллер вида находится в верхней части навигационного стека -> vcs [vcs.count - 1]; в этом стеке есть контроллер представления до этого -> vcs [vcs.count - 2]; и файл navigationItem.title этого предыдущего контроллера может быть изменен без нежелательных побочных эффектов; мы можем изменить текст кнопки обратной связи, изменив заголовок навигации предыдущего контроллера.

Смежные вопросы