Swift:无法识别的选择器发送到类,NSObject类中的按钮目标

时间:2017-07-23 09:39:00

标签: ios swift

请不要将此问题标记为重复,因为我尝试了各种解决方案,但并不是很有效。我在FormViewController中创建了一个headerView(我使用了Eureka),我将我的视图分成了一个单独的HeaderViews: NSObject来观察MVC原理。我试图添加一个buttonTarget,但它会抛出错误unrecognized selector sent to class。我的代码如下:

class ProfileSettingsViewController: FormViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        form +++

            Section(){ section in
                section.header = {
                    var header = HeaderFooterView<UIView>(.callback({
                        let view = HeaderViews.setUpHeaderForProfileView(user: self.user)
                        return view
                    }))
                    header.height = { 200 }
                    return header
                }()
            }
        }

在我的HeaderViews中:

class HeaderViews: NSObject {

    static func setUpHeaderForProfileView(user: User) -> UIView {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: screen.width, height: 100))
        let changeAvatarButton = UIButton(frame: CGRect(x: (screen.width / 2) - 50, y: avatarImageView.frame.maxY + 10, width: 100, height: 20))
        changeAvatarButton.addTarget(self, action: #selector(getAvatar(_:)), for: .touchUpInside)
        view.addSubview(changeAvatarButton)
        return view
    }

    func getAvatar(_ sender: UIButton!) {
        print("Change Avatar tapped")
    }
}

我不确定自己是否犯过任何错误,因为我在这篇文章中尝试过各种选择器方法:Unrecognized selector sent to class

我怀疑它可能与子类NSObject有关。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果您没有使用UIButton参数,请定义 func getAvatar(),不带参数或func getAvatar(_ sender:AnyObject?)

函数调用将更改为此。 changeAvatarButton.addTarget(self,action:#selector(getAvatar),for:.touchUpInside)

另外我很好奇为什么不将 HeaderViews 定义为 UIView 的子类?

这可能实际上是这里的问题。

答案 1 :(得分:0)

<强>更新 如果您无法获得HeaderViews的实例。然后只需将getAvatar更改为静态功能。

static func getAvatar(_ sender: UIButton!) {
    print("Change Avatar tapped")
}

<强>来源 您不应在静态函数中使用self作为目标。 因为此self表示HeaderViews。 将实例传递给目标。

例如:

static func setUpHeaderForProfileView(user: User, in instance: HeaderViews) -> UIView {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: screen.width, height: 100))
    let changeAvatarButton = UIButton(frame: CGRect(x: (screen.width / 2) - 50, y: avatarImageView.frame.maxY + 10, width: 100, height: 20))
    changeAvatarButton.addTarget(instance, action: #selector(getAvatar(_:)), for: .touchUpInside)
    view.addSubview(changeAvatarButton)
    return view
}