【问题标题】:UIBarButtonItem -> unrecognized selector sent to instanceUIBarButtonItem -> 无法识别的选择器发送到实例
【发布时间】:2020-03-11 19:53:45
【问题描述】:

我有一个 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
        }
    }
}

但我得到一个错误:无法识别的选择器发送到实例。

【问题讨论】:

  • 第一行代码在哪个类中?换句话说,创建按钮项时self到底是什么?

标签: ios uibarbuttonitem


【解决方案1】:

参数target的值必须是实现action的类的实例

self 表示action 在当前类中实现。

【讨论】:

  • 那么正确的代码是什么?我试过 target: GoToPages.self 但它不工作......
  • 我写道:...必须是类的实例。您需要引用GoToPages 的实际实例。
  • 现在我尝试了:self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named:"settings"), style: .plain, target: GoToPages(), action: #selector(GoToPages.goToSettings (_:))) 现在没有错误,但是当我单击 Bar 按钮项时注意追加...
  • 没有。 GoToPages() 创建一个新实例,它不是视图层次结构中的实例。再次,您需要对实际实例的引用,它是视图层次结构中的实例。
  • 顺便说一句,这个问题与 Swift 4 并没有特别的关系
【解决方案2】:

您应该删除“GoToPages”。来自#selector(GoToPages.goToSettings(_:))的选择器定义:

#selector(goToSettings(_:))

因为 GoToPages.goToSettings 是类函数,并且由于您的参数“目标:自我”而应该是实例方法。这里 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) {

}

【讨论】:

    【解决方案3】:

    我的代码:

    导入 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2012-07-24
      相关资源
      最近更新 更多