You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中#selector传参报方法未暴露给Objective-C错误如何解决?

报错原因
  • #selector 依赖 Objective-C runtime 实现消息发送,所有被#selector引用的方法必须暴露给 Objective-C 才能被识别调用,你当前的changePassword是纯Swift方法,没有做暴露标记。
  • 即使添加暴露标记,该方法也无法直接作为UIButton的点击事件回调:UIButton触发的action方法最多仅支持1个参数(即触发事件的控件本身),你的方法需要四个入参(含逃逸闭包),按钮无法自动传入对应参数,运行时就算不报错也无法正常执行业务逻辑。
解决步骤
  1. 单独声明适配UIButton回调规则的点击方法,添加@objc标记暴露给Objective-C,在方法内部获取业务参数后调用原有密码修改逻辑:
@objc private func confirmBtnDidClick() {
    // 此处从对应输入控件中获取所需的账号、密码参数
    guard let email = emailInputField.text,
          let currentPassword = currentPwdInputField.text,
          let newPassword = newPwdInputField.text else {
        // 可自行添加参数校验不通过的提示逻辑
        return
    }
    // 调用原有修改密码方法
    changePassword(email: email, currentPassword: currentPassword, newPassword: newPassword) { error in
        if let error = error {
            // 密码修改失败处理逻辑
            print("修改失败:\(error.localizedDescription)")
        } else {
            // 密码修改成功处理逻辑
            print("修改成功")
        }
    }
}
  1. 修改按钮的点击事件绑定代码,指向新的回调方法:
confirmBtn.addTarget(self, action: #selector(confirmBtnDidClick), for: .touchUpInside)
注意事项
  • 若绑定的回调方法是类的私有方法,必须显式添加@objc标记,否则Objective-C runtime无法检索到该方法。
  • UI控件的target-action回调仅支持固定的方法签名,不要直接把带自定义参数、闭包的业务方法作为回调绑定。

内容的提问来源于stack exchange,提问作者AppleLog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 12:06:04