为什么UIBarButtonItem操作不会在单独的类中触发?

问题描述 投票:1回答:1

我写了一个类来处理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()
    }
}
ios swift
1个回答
2
投票

这里的问题是你在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()
    }
}

这样内存引用保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.