UINavigationController действует забавно после pushViewController ОБНОВЛЕНИЕ 2

У меня странная проблема, у меня в приложении есть слайд-меню, по какой-то неизвестной причине, каждый раз, когда я перехожу из одного вида в другой с помощью инструкции.pushViewController, контроллер навигации работает странно, и он сбрасывает мои UIBarButtonItems. (Они изменяют свой первоначальный цвет оттенка, и значение badgeValue исчезает).

Это методы, которые я использую в слайд-меню, чтобы сделать переход:

func openViewControllerBasedOnIdentifier(_ strIdentifier:String){
    let destViewController : UIViewController = self.storyboard!.instantiateViewController(withIdentifier: strIdentifier)


    let topViewController : UIViewController = self.navigationController!.topViewController!

    if (topViewController.restorationIdentifier! == destViewController.restorationIdentifier!){
        print("Same VC")
    } else {
        var numeroProductos = String(Carrito.numProd)

        self.navigationController!.pushViewController(destViewController, animated: true)


    }
}

а также

func slideMenuItemSelectedAtIndex(_ index: Int32) {
    let topViewController: UIViewController = self.navigationController!.topViewController!
    print("View Controller is : \(topViewController) \n", terminator: "")
    switch(index) {
    case 0:
        print("Home\n", terminator: "")

        self.openViewControllerBasedOnIdentifier("Home")

        break

    case 1:
        print("Play\n", terminator: "")

        self.openViewControllerBasedOnIdentifier("MiCuenta")

        break

    case 2:
        print("Play\n", terminator: "")

        self.openViewControllerBasedOnIdentifier("QuienesSomos")

        break

    case 3:
        print("Play\n", terminator: "")

        self.openViewControllerBasedOnIdentifier("NuestraCausa")

        break

    case 4:
        print("Play\n", terminator: "")

        self.openViewControllerBasedOnIdentifier("Contacto")

        break

    case 5:
        print("Play\n", terminator: "")

        self.openViewControllerBasedOnIdentifier("FAQ")

        break

    default:
        print("default\n", terminator: "")
    }
}

Согласно собственной документации Apple:

Объект UINavigationItem управляет кнопками и представлениями, отображаемыми в объекте UINavigationBar. При создании интерфейса навигации каждый контроллер представления, помещаемый в стек навигации, должен иметь объект UINavigationItem, который содержит кнопки и представления, которые он хочет отображать на панели навигации. Управляющий объект UINavigationController использует элементы навигации двух верхних контроллеров представления, чтобы заполнить панель навигации содержимым.

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

Это код, который я имею в моем методе viewDidLoad в этом представлении

override func viewDidLoad() {
    super.viewDidLoad()
    addSlideMenuButton()
    Carrito.numProd = productosCarrito.count
    print(productosCarrito.count)
    var numeroProductos = String(Carrito.numProd)
    navigationItem.rightBarButtonItem?.badgeValue = numeroProductos

}

Если я попадаю на страницу без использования слайд-меню (например, когда вы переходите туда после успешной очистки представления входа в систему), badgeValue отображается правильно

Но если я использую слайд-меню, это происходит

Любые идеи о том, что может быть причиной этой проблемы?

ОБНОВИТЬ

Я обнаружил что-то.

Если я вставлю эту инструкцию либо в метод openVIewControllerBasedOnIdentifier, либо в slideMenuSelectedAtIndex

navigationItem.rightBarButtonItem?.badgeValue = "25"

Перед тем, как исчезнуть, значение бейджа меняется на этот номер, я тоже использую эту инструкцию

print("Badge Value:\(navigationItem.rightBarButtonItem?.badgeValue as Any)")

так что значение есть, потому что я получаю это в консоли отладки:

Badge Value: Optional("40")

Но по неизвестной причине исчезает

UDATE 2

 self.navigationController!.pushViewController(destViewController, animated: false)

Я обнаружил, что если я отключаю анимацию, значение значка не исчезает, но мне нужна анимация, чтобы работать тоже.

1 ответ

Решение

Я нашел решение, и на самом деле это очень просто, чтобы избежать такого поведения, следует установить badgeValue в viewDidLayoutSubViews() вместо viewDidLoad()

override func viewDidLayoutSubviews() {
    var numeroProductos = String(Carrito.numProd)
    carritoButton.badgeValue = numeroProductos
}

РЕДАКТИРОВАТЬ Библиотека MikeMTOL содержит ошибки и вызывает много проблем, не только этот, поэтому для пользователей Swift я рекомендую эти расширения вместо этого. -> ссылка

Другие вопросы по тегам