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
相关产品推荐
相关产品推荐

