2015-07-17 4 views
0

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

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Update back button in the nav bar 
    updateBackButton() 

    // Text field delegation 
    nameTextField.delegate = self 
    nameTextField.addTarget(self, action: "updateBackButton", forControlEvents: .EditingChanged) 
} 
func updateBackButton() { 
    let backButton = UIBarButtonItem(
     title: formHasChanged ? "Cancel" : "Back", 
     style: .Done, 
     target: nil, 
     action: nil 
    ) 
    print(backButton.title) 
    navigationController?.navigationBar.topItem?.backBarButtonItem = backButton 
} 

Это делает силу через кнопку назад только один раз, в методе viewDidLoad. При последующих вызовах updateBackButton() видимых изменений нет, хотя print(backButton.title) распечатывает соответствующий вывод.

Что не хватает в моем подходе, чтобы иметь динамически обновляемое название кнопки «Назад»?

Вывод отчета о печати updateBackButton().

Optional("Back") 
Optional("Cancel") 
Optional("Back") 
Optional("Cancel") 
Optional("Back") 

ответ

1

Если вы хотите вызвать function как action от цели любого элемента управления, то вы должны будете определить его как @IBAction и использовать : при вызове его. Так же, как

override func viewDidLoad() { 
super.viewDidLoad() 
// Update back button in the nav bar 
// updateBackButton() // Now you don't need to call it here, I guess.. 

// Text field delegation 
nameTextField.delegate = self 
nameTextField.addTarget(self, action: "updateBackButton:",forControlEvents: .EditingChanged) 
} 

@IBAction func updateBackButton(sender: AnyObject!) { 
let backButton = UIBarButtonItem(
    title: formHasChanged ? "Cancel" : "Back", 
    style: .Done, 
    target: nil, 
    action: nil 
) 
print(backButton.title!) 
navigationController?.navigationBar.topItem?.backBarButtonItem = backButton 
} 

Update:

Попробуйте изменить эту строку

navigationController?.navigationBar.topItem?.backBarButtonItem = backButton с navigationController?.navigationBar.topItem?.leftBarButtonItem = backButton или просто navigationItem.leftBarButtonItem = backButton

PS: Он не покажет вам < символ, но я думайте, что вам это не нужно, как вы имеют дело с cancel и done.

Его работая сейчас. Надеюсь, это сработает и для вас!

+0

Я не вижу разницы. Этот метод вызывался и продолжает это делать. Но название кнопки навигации еще не изменилось. Я что-то упускаю? –

+0

проверить значение 'formHasChanged'. Лучше распечатайте его внутри функции. – iRiziya

+0

Как я уже упоминал в своем вопросе, этот вывод правильный. Я обновил вопрос, чтобы содержать вывод. Метод вызывается, 'formHasChanged' содержит правильное значение. Просто панель навигации не обновляется. –

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