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 я рекомендую эти расширения вместо этого. -> ссылка