我写了一个类来处理 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")
}
}
这就是按钮等附加到导航项的 View Controller 中发生的情况。
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()
}
}
最佳答案
这里的问题是您在 viewDidload()
中实例化了 NavigationBarHandler
,这就是内存引用在 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()
}
}
这样内存引用就会保留。
关于ios - 为什么 UIBarButtonItem 操作不会在单独的类中触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49026991/