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

Swift 4 手机号键盘Done按钮点击崩溃问题求助

解决Swift注册表单手机号键盘Done按钮崩溃问题

嘿,我来帮你搞定这个问题!你遇到的崩溃其实是Swift里Selector写法的坑,再加上代码里的一些逻辑小问题,咱们一步步来修复:

崩溃的直接原因

你用了旧的Objective-C风格的字符串Selector:Selector(("doneButtonAction")),这种写法在Swift里编译器不会帮你检查方法是否存在,一旦方法名写错或者没有暴露给OC运行时,点击Done按钮就会触发“未识别选择器”崩溃。

修复步骤

1. 修正Selector写法并暴露方法给OC

把done按钮的创建代码改成Swift推荐的#selector语法,同时给doneButtonAction方法加上@objc修饰符,让OC运行时能找到它:

// 修改addDoneButtonOnKeyboard里的done按钮创建
let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneButtonAction))

// 修改doneButtonAction方法
@objc func doneButtonAction() {
    self.registerTF[5].resignFirstResponder()
    // 可以在这里补上手机号验证逻辑,用户点击Done时再验证
    if let phoneText = registerTF[5].text, !isValidPhone(value: phoneText) {
        displayAlert(alertMessage: "Please make sure that the phone number is correct")
    }
}

2. 调整Done按钮的添加时机

你现在是在nextTextFieldToFirstResponder里每次切换到手机号输入框时都调用addDoneButtonOnKeyboard,这会重复创建Toolbar,没必要。应该在viewDidLoad里一次性设置好:

override func viewDidLoad() {
    super.viewDidLoad()
    // 给手机号输入框添加Done按钮
    addDoneButtonOnKeyboard()
    // 别忘了给所有输入框设置delegate(如果需要用UITextFieldDelegate方法的话)
    registerTF.forEach { $0.delegate = self }
}

3. 修正输入框切换逻辑

你在nextTextFieldToFirstResponder的senderTag ==5分支里直接调用了doneButtonAction,这会导致用户刚切换到手机号输入框就收起键盘,完全不符合预期。把这部分逻辑改成:

} else if senderTag == 5 { // Phone Number
    // 这里只处理切换到手机号输入框的必要逻辑,比如设置键盘类型(如果没在Storyboard设置的话)
    registerTF[5].keyboardType = .numberPad
    // 不要直接调用doneButtonAction!
}

其他可选实现思路

如果觉得手动加Toolbar麻烦,也可以考虑:

  • 你已经写了touchesBegan方法,用户点击空白处就能收起键盘,这个逻辑可以保留作为补充
  • 利用第三方库自动给所有键盘添加Done按钮,但新手阶段建议自己实现,能更好理解iOS键盘的工作原理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:57:55