UIBarButtonItem->无法识别的选择器发送到实例

问题描述 投票:0回答:3

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

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

ios uibarbuttonitem
3个回答
1
投票

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

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


0
投票

我的代码:

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

0
投票

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

#selector(goToSettings(_:))

因为GoToPages.goToSettings是类函数,并且由于您的参数'target:self'应该是实例方法才能工作。这里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) {

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