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

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:数组需要存储多个不同输入框的手机号

如果后续要扩展多个手机号输入框,可以通过字典存储每个输入框的最新值,最终再导出为数组:

  1. 先定义存储变量:
// 以输入框的tag为key,存储对应输入框的最新手机号
var phoneDict: [Int: String] = [:]
// 最终传给API的数组,实时同步字典的所有值
var phoneNo: [String] { Array(phoneDict.values) }
  1. 提前给每个手机号输入框设置唯一tag,比如:
contact_PhoneNumberTextField.tag = 1001
// 其他输入框依次设置1002、1003...
  1. 修改代理存入逻辑:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:02