Swift中如何将TextField值存入数组且修改值时替换而非追加新元素
问题根源
textFieldDidEndEditing代理方法中每次触发都调用append向数组追加元素,同一个TextField多次编辑就会产生多条冗余数据,可根据业务场景选择以下修改方案:
方案1:数组仅存储该单个手机号(适配当前单输入框场景)
直接覆盖数组内容,确保每次只保留最新值,修改textFieldDidEndEditing实现即可:
func textFieldDidEndEditing(_ textField: UITextField) { if textField == contact_PhoneNumberTextField{ // 清空原有内容后添加新值,保证数组内仅保留最新手机号 phoneNo.removeAll() phoneNo.append(getOriginalPhoneNumber(phone: textField.text ?? "")) // 也可以直接简写为: // phoneNo = [getOriginalPhoneNumber(phone: textField.text ?? "")] } }
方案2:数组需要存储多个不同输入框的手机号
如果后续要扩展多个手机号输入框,可以通过字典存储每个输入框的最新值,最终再导出为数组:
- 先定义存储变量:
// 以输入框的tag为key,存储对应输入框的最新手机号 var phoneDict: [Int: String] = [:] // 最终传给API的数组,实时同步字典的所有值 var phoneNo: [String] { Array(phoneDict.values) }
- 提前给每个手机号输入框设置唯一tag,比如:
contact_PhoneNumberTextField.tag = 1001 // 其他输入框依次设置1002、1003...
- 修改代理存入逻辑:
func textFieldDidEndEditing(_ textField: UITextField) { let currentPhone = getOriginalPhoneNumber(phone: textField.text ?? "") // 直接覆盖对应tag的旧值,不会产生冗余 phoneDict[textField.tag] = currentPhone }
方案3:实时同步最新值(无需等待编辑结束)
如果希望输入过程中数组就同步最新值,可以把更新逻辑放到shouldChangeCharactersIn方法中:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { switch textField { case contact_PhoneNumberTextField: guard let text = textField.text else { return false } let newString = (text as NSString).replacingCharacters(in: range, with: string) let formattedText = formatPhoneNumber(phoneString: newString) textField.text = formattedText // 输入过程中实时更新数组,永远保留最新值 phoneNo = [getOriginalPhoneNumber(phone: formattedText)] return false default: return true } }
内容的提问来源于stack exchange,提问作者Saranya
相关产品推荐
相关产品推荐

