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

标签 ios swift

我写了一个类来处理 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/

相关文章:

ios - 是否可以将 paypalpaymentviewcontroller View 放置在 uiview 中?

ios:当应用程序处于焦点时禁用警报通知(OneSignal)

swift - 需要点击两次才能取消选中表格单元格

ios - 如何使用 facebook applink 托管动态内容 - IOS

android - 是否可以以编程方式重新启动 Ionic 应用程序?

ios - 在 iPad 上运行的 iPhone 应用程序缺少 "2x"按钮

swift - 在主项目中找不到链接到 Cocoapod 的静态框架

ios - 如何在闭包中访问类的变量?

ios - Azure + Swift 推送通知

ios - 如何立即隐藏单个 View Controller 上的导航栏?