我有一个奇怪的问题,我的应用程序中有一个幻灯片菜单,由于某种未知的原因,每次我使用 .pushViewController 指令从一个视图转到另一个视图时,导航控制器的行为很有趣,它会重置我的 UIBarButtonItems。(它们变为原来的 tintcolor,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")
但是不知什么原因消失了
日期 2
self.navigationController!.pushViewController(destViewController, animated: false)
我发现如果我关闭动画,徽章值不会消失,但我也需要动画才能工作。