Swift中#selector传参报方法未暴露给Objective-C错误如何解决?
报错原因
#selector依赖 Objective-C runtime 实现消息发送,所有被#selector引用的方法必须暴露给 Objective-C 才能被识别调用,你当前的changePassword是纯Swift方法,没有做暴露标记。- 即使添加暴露标记,该方法也无法直接作为UIButton的点击事件回调:UIButton触发的action方法最多仅支持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("修改成功") } } }
- 修改按钮的点击事件绑定代码,指向新的回调方法:
confirmBtn.addTarget(self, action: #selector(confirmBtnDidClick), for: .touchUpInside)
注意事项
- 若绑定的回调方法是类的私有方法,必须显式添加
@objc标记,否则Objective-C runtime无法检索到该方法。 - UI控件的target-action回调仅支持固定的方法签名,不要直接把带自定义参数、闭包的业务方法作为回调绑定。
内容的提问来源于stack exchange,提问作者AppleLog
相关产品推荐
相关产品推荐

