Кнопка 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];