Ios 从Swift中的另一个ViewController访问rightBarButton功能

Ios 从Swift中的另一个ViewController访问rightBarButton功能,ios,swift,function,viewcontroller,Ios,Swift,Function,Viewcontroller,我正在尝试访问用于从另一个ViewController显示购物车的rightBarButton函数,尽管我可以调用该函数,但它不会显示任何图像,即购物车图像 下面的代码显示了如何调用此函数 override func viewDidLoad() { super.viewDidLoad() // Adding Right Bar Button Item let rightBarButton = RightBarButton()

我正在尝试访问用于从另一个
ViewController
显示购物车的
rightBarButton
函数,尽管我可以调用该函数,但它不会显示任何图像,即购物车图像

下面的代码显示了如何调用此函数

override func viewDidLoad() {
            super.viewDidLoad()
            // Adding Right Bar Button Item
            let rightBarButton = RightBarButton()
            rightBarButton.addingRightButton()
    }
class RightBarButton {

    var storyboard = UIStoryboard()
    var navigationItem = UINavigationItem()
    var navigationController = UINavigationController()

    func addingRightButton() {

        let image = UIImage(named: "cart") 

        let finalImage = resizeImage(image: image!, newWidth: 30)

        navigationItem.rightBarButtonItem = FFBadgedBarButtonItem(image: finalImage, target: self, action: #selector(rightButtonTouched))

        let button = navigationItem.rightBarButtonItem as? FFBadgedBarButtonItem

        cartCount { (cartCount) in
            print("Api calling done ...")
            print(cartCount)
            button?.badge = "\(cartCount)"
        }
    }

    @objc func rightButtonTouched() {
        // print("Event Called")
    }

    func cartCount(completion: @escaping (Int) -> Void) {
        // print("Api calling ...")
    }
}
下面的代码显示了
右按钮
功能

override func viewDidLoad() {
            super.viewDidLoad()
            // Adding Right Bar Button Item
            let rightBarButton = RightBarButton()
            rightBarButton.addingRightButton()
    }
class RightBarButton {

    var storyboard = UIStoryboard()
    var navigationItem = UINavigationItem()
    var navigationController = UINavigationController()

    func addingRightButton() {

        let image = UIImage(named: "cart") 

        let finalImage = resizeImage(image: image!, newWidth: 30)

        navigationItem.rightBarButtonItem = FFBadgedBarButtonItem(image: finalImage, target: self, action: #selector(rightButtonTouched))

        let button = navigationItem.rightBarButtonItem as? FFBadgedBarButtonItem

        cartCount { (cartCount) in
            print("Api calling done ...")
            print(cartCount)
            button?.badge = "\(cartCount)"
        }
    }

    @objc func rightButtonTouched() {
        // print("Event Called")
    }

    func cartCount(completion: @escaping (Int) -> Void) {
        // print("Api calling ...")
    }
}
如果我将此代码添加到
viewDidLoad()
中,图像将显示,单击事件也会工作


如果您找到任何有关此代码的解决方案,请提供帮助

它不起作用,因为
RightBarButton
类中的
navigationItem
不是任何导航控件的一部分(因为它是手动创建的,并且没有显式附加)

使创建的
FFBadgedBarButtonItem
实例可供视图控制器访问,以便正确添加它:

override func viewDidLoad() {
    super.viewDidLoad()
    // Adding Right Bar Button Item
    let rightBarButton = RightBarButton()
    rightBarButton.addingRightButton()

    navigationItem.rightBarButtonItem = rightBarButton.badgeBarItem // badgeBarItem is the property exposed to the view controller
}
编辑的
RightBarButton
类:

class RightBarButton {

    var badgeBarItem: FFBadgedBarButtonItem?

    func addingRightButton() {

        let image = UIImage(named: "cart")

        let finalImage = resizeImage(image: image!, newWidth: 30)

        badgeBarItem = FFBadgedBarButtonItem(image: finalImage, target: self, action: #selector(rightButtonTouched))

        cartCount { [weak self] cartCount in
            print("Api calling done ...")
            print(cartCount)
            self?.badgeBarItem?.badge = "\(cartCount)"
        }
    }

    @objc func rightButtonTouched() {
        // print("Event Called")
    }

    func cartCount(completion: @escaping (Int) -> Void) {
        // print("Api calling ...")
    }
}

您需要使用
rightBarButton
检索所需的
ViewController
实例,例如
neededViewController
。然后你可以这样称呼它:

neededViewController.viewDidLoad()
或者在
neededViewController
的类中使用下一个内容创建另一个方法:

func addRB () {
// let rightBarButton = RightBarButton(image: UIImage(named: "imageName"), landscapeImagePhone: UIImage(named: "imageName"), style: .done, target: self, action: nil)   

   let nc = navigationController
   let navBar = nc?.navigationBar

   let but = UIBarButtonItem(image: UIImage(named: "imageName"), landscapeImagePhone: UIImage(named: "imageName"), style: .done, target: self, action: nil)

// try to create RightBarButton with defined images and a text and pass it instead of `but`
   navBar?.topItem?.setRightBarButton(but, animated: false)
}

调用
neededViewController.addRB()

得到一个错误
类型为“RightBarButton”的值没有成员“badgeBarItem”
我的意思是badgeBarItem是在RightBarButton中声明的成员,您可以使用所需的项初始化它。您需要声明它并将其设置为创建的FFBadgedBarButtonItem实例(请参见我编辑的答案),如下所示我已在RightBarButton内初始化,但没有更改任何内容我已尝试过您的代码,现在它显示图像,但没有显示购物车图标上的数字现在该怎么办?您是否收到所需的视图控制器?是的,它显示了打印语句(来自RightBarButton函数)但是没有显示相同的问题。你是说
DispatchQueue.main.async
我没有使用它是的(或者通过单击某个UI(UIButton)。如果你想影响UI,你必须在主线程中调用代码。我尝试使用
DispatchQueue.main.async
,但没有任何更改仍然是相同的输出。