Кнопка iOS UINavigationBar остается потушенной после повторной записи
В моем приложении у меня есть несколько контроллеров представлений, и большинство из них имеют правую сторону UIBarButtonItem
с прикрепленными к ним действиями "show".
Перейдя к другому представлению, а затем нажав кнопку '< Back'
, исходный элемент кнопки остается потушенным, хотя в остальном его можно использовать.
Это происходит только в iOS 11.2.
Я не вижу никаких настроек, которые могли бы это сделать, и, по крайней мере, в одном из случаев, когда это происходит, нет никакой специальной отмены сеанса и обработки viewDidAppear
. Я бы опубликовал код, но AFAICS все это просто по умолчанию UINavigationBar
.
Ответы
Ответ 1
Это ошибка в iOS 11.2 и происходит потому, что UIBarButtonItem
остается выделенной после навигации и не возвращается в нормальное состояние после появления другого контроллера.
Чтобы избежать этого поведения,
-
используйте UIBarButtonItem
с UIButton
как пользовательский вид
-
отключить и снова включить элемент кнопки панели в viewWillDisappear(_:)
(хотя это приводит к немедленному появлению кнопки, используйте матовый раствор, чтобы этого избежать)
barButtonItem.isEnabled = false
barButtonItem.isEnabled = true
Ответ 2
Я использую эту ошибку в контроллере представления viewWillAppear
следующим образом:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.tintAdjustmentMode = .normal
self.navigationController?.navigationBar.tintAdjustmentMode = .automatic
}
Это похоже на пробуждение кнопки без визуальных артефактов.
Ответ 3
Еще одна проблема заключается в том, чтобы реализовать исправление на родительском диспетчере навигации - так, чтобы каждый из его childController для просмотра получил исправление следующим образом
ПРИМЕЧАНИЕ. Для этого требуется, чтобы класс приема был настроен как делегат UINavigationController
Swift
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if #available(iOS 11.2, *) {
navigationBar.tintAdjustmentMode = .normal
navigationBar.tintAdjustmentMode = .automatic
}
}
Objective-C
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (@available(iOS 11.2, *)) {
self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
}
}
Ответ 4
Я решил это так:
override func viewWillDisappear(_ animated: Bool) {
navigationController?.navigationBar.tintAdjustmentMode = .normal
navigationController?.navigationBar.tintAdjustmentMode = .automatic
}
чтобы восстановить цвет до появления другого вида
Ответ 5
Для синтаксиса Objective-C: - - Сделайте это в willAppear, и это сработает
[self.navigationController.navigationBar setTintAdjustmentMode:UIViewTintAdjustmentModeNormal];
[self.navigationController.navigationBar setTintAdjustmentMode:UIViewTintAdjustmentModeAutomatic];