我有一个UIBarButtonItem,我想在另一个类中使用pushViewController。所以我在viewDidLoad中有这行代码:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named:"settings"), style: .plain, target: self, action: #selector(GoToPages.goToSettings(_:)))
这是我的GoToPages类:
import UIKit
class GoToPages: UIViewController {
@objc func goToSettings(_ sender:UIBarButtonItem) {
let button = sender
switch button.tag {
case 0:
let settingsPageView = self.storyboard?.instantiateViewController(withIdentifier: "Notifications")
self.navigationController?.pushViewController(settingsPageView!, animated: true)
case 1:
let settingsPageView = self.storyboard?.instantiateViewController(withIdentifier: "Settings")
self.navigationController?.pushViewController(settingsPageView!, animated: true)
default:
return
}
}
}
但是我收到一个错误:无法识别的选择器发送到实例。
参数target
的值必须是实现action
的类的实例。
[self
表示action
是在当前类中实现的。
我的代码:
导入UIKit
扩展UIViewController {
@objc func goToPage(_ sender: Any) {
guard let button = sender as? UIBarButtonItem else {
return
}
switch button.tag {
case 0:
let settingsPageView = self.storyboard?.instantiateViewController(withIdentifier: "Notifications")
self.navigationController?.pushViewController(settingsPageView!, animated: true)
case 1:
let settingsPageView = self.storyboard?.instantiateViewController(withIdentifier: "Settings")
self.navigationController?.pushViewController(settingsPageView!, animated: true)
default:
return
}
}
您应该删除'GoToPages。'来自#selector(GoToPages.goToSettings(_:))
的选择器定义:
#selector(goToSettings(_:))
因为GoToPages.goToSettings是类函数,并且由于您的参数'target:self'应该是实例方法才能工作。这里self指定实例,因此您的选择器必须是实例方法。
如果万一这不能解决您的问题,请使用self.navigationItem.setRightBarButton(...)
而不是直接分配给self.navigationItem.rightBarButtonItem = ...
这是对我有用的代码:
override func viewDidLoad() {
super.viewDidLoad()
let barButtonItem = UIBarButtonItem(image: UIImage(named: "image"),
style: .plain,
target: self,
action: #selector(barButtonItemTapped(sender:))
navigationItem.setRightBarButtonItems([barButtonItem], animated: true)
}
@objc private func barButtonItemTapped(sender: UIBarButtonItem) {
}