我写了一个类来处理UIBarButtonItem
水龙头。初始化程序引用了UINavigationItem
。所有按钮等都附在这个UINavigationItem
上。我尝试将它们与动作(didPressMenuItem()
)连接起来,但是当我单击按钮时,动作不会被触发(没有任何内容写入控制台,也没有触发我设置的断点)。
如何将UIBarButtonItem
链接到此类中定义的函数?
internal final class NavigationBarHandler {
// MARK: Properties
private final var navigationItem: UINavigationItem?
// MARK: Initializers
required init(navigationItem: UINavigationItem?) {
self.navigationItem = navigationItem
}
internal final func setupNavigationBar() {
if let navigationItem = navigationItem {
let menuImage = UIImage(named: "menu")?.withRenderingMode(.alwaysTemplate)
let menuItem = UIBarButtonItem(image: menuImage, style: .plain, target: self, action: #selector(didPressMenuItem(sender:)))
menuItem.tintColor = .white
navigationItem.leftBarButtonItem = menuItem
}
}
@objc func didPressMenuItem(sender: UIBarButtonItem) {
print("pressed")
}
}
这是在按钮等附加了navigationItem的视图控制器中发生的情况。
class ContactsController: UIViewController {
// MARK: View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
self.title = "Kontakte"
let navigationBarHandler = NavigationBarHandler(navigationItem: self.navigationItem)
navigationBarHandler.setupNavigationBar()
}
}
这里的问题是你在NavigationBarHandler
中实例化viewDidload()
,这就是为什么在viewDidLoad()
完成后内存引用会死掉的原因。你应该做的是像这样在外部创建变量。
class ContactsController: UIViewController {
var navigationBarHandler: NavigationBarHandler!
// MARK: View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
self.title = "Kontakte"
self.navigationBarHandler = NavigationBarHandler(navigationItem: self.navigationItem)
navigationBarHandler.setupNavigationBar()
}
}
这样内存引用保持不变。