Кнопка iOS UINavigationBar остается блеклой после перехода назад

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

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

Это происходит только в iOS 11.2.

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


person Alnitak    schedule 11.12.2017    source источник
comment
Надеюсь, вы зарегистрировали радар на эту ужасную, ужасную ошибку.   -  person picciano    schedule 23.12.2017
comment
Похоже, это решено в iOS 11.3.   -  person Andrew Bennet    schedule 01.04.2018


Ответы (4)


Это ошибка в iOS 11.2, которая возникает из-за того, что UIBarButtonItem остается выделенным после навигации и не возвращается в свое нормальное состояние после появления другого контроллера представления.

Чтобы избежать такого поведения, либо

  1. используйте UIBarButtonItem с UIButton в качестве пользовательского вида

  2. отключите и снова включите элемент кнопки панели в viewWillDisappear(_:) (хотя это приводит к немедленному отображению кнопки, используйте решение Мэтта, чтобы избежать это):

    barButtonItem.isEnabled = false
    barButtonItem.isEnabled = true
    
person Tamás Sengel    schedule 11.12.2017
comment
Спасибо за ответ. Можно ли также сбросить состояние кнопки в методе viewDidAppear()? - person Alnitak; 11.12.2017
comment
@Alnitak Я добавил в свой ответ второй вариант, который решает проблему по-другому. - person Tamás Sengel; 11.12.2017
comment
спасибо - либо работает, я не уверен, что я нахожу более привлекательным. Если я сделаю это в viewWillDisappear(_:), то кнопка будет сразу видна, когда появится представление. Если я сделаю это в viewDidAppear(_:), то он снова станет видимым. - person Alnitak; 11.12.2017
comment
p.s. если вы знаете какие-либо ссылки на другие отчеты об этом поведении, это было бы очень полезно - person Alnitak; 11.12.2017
comment
Вы также можете перевернуть включенное состояние в viewDidDisappear вместо viewWillDisappear. Никаких визуальных артефактов. - person jab; 09.04.2018
comment
Странный. Ни одно из решений не работает на моей стороне при выполнении всплывающей навигации с помощью пользовательского интерактивного аниматора: 0 - person Vlad; 13.06.2018
comment
В итоге я получил UIBarButtonItem с пользовательским представлением (UIButton) внутри. - person Vlad; 13.06.2018

Что я делаю, так это работаю над этой ошибкой в ​​​​контроллере представления viewWillAppear следующим образом:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.tintAdjustmentMode = .normal
    self.navigationController?.navigationBar.tintAdjustmentMode = .automatic
}

Вот вроде просыпается кнопка без визуальных артефактов.

person matt    schedule 15.12.2017
comment
Это не работает, когда пользователь провел пальцем назад, используя жест края. Пробовал viewDidAppear, и он работает, но затем, когда мы возвращаемся с помощью кнопки, появляется небольшая задержка для отображения просмотра. Любые мысли, как мы можем улучшить это? - person mkz; 02.01.2018
comment
Спасибо! Это работает для меня. Как для нажатия кнопки «Назад», так и для свайпа. - person derf26; 08.01.2018

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

ПРИМЕЧАНИЕ. Для этого требуется, чтобы принимающий класс был настроен как делегат UINavigationController.

Свифт

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    if #available(iOS 11.2, *) {
        navigationBar.tintAdjustmentMode = .normal
        navigationBar.tintAdjustmentMode = .automatic
    }
}

Цель-C

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {    
    if (@available(iOS 11.2, *)) {
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
    }
}
person microbee    schedule 28.12.2017
comment
Не уверен, что я делаю что-то не так, но я не могу заставить это (или любой другой обходной путь) работать, когда я использую popViewController(_), чтобы вернуться к рассматриваемому представлению. Кто-нибудь испытывает то же самое? - person Linus Unnebäck; 21.03.2018

Я решил это так:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.tintAdjustmentMode = .normal
    navigationController?.navigationBar.tintAdjustmentMode = .automatic
}

поэтому он восстановит цвет до того, как появится другой вид

person Alex Balan    schedule 12.01.2018