0

我有一个奇怪的问题,我的应用程序中有一个幻灯片菜单,由于某种未知的原因,每次我使用 .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)

我发现如果我关闭动画,徽章值不会消失,但我也需要动画才能工作。

4

1 回答 1

1

我找到了解决方案,实际上它非常简单,为了避免这种行为,应该设置 badgeValueviewDidLayoutSubViews()而不是viewDidLoad()

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

编辑MikeMTOL 的库有问题,不仅会导致很多问题,因此对于 Swift 用户,我推荐使用这些扩展。->链接

于 2017-01-09T16:22:39.830 回答