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
,但没有任何更改仍然是相同的输出。