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

Swift:下拉菜单选中城市后无法获取对应ID,求技术指导

解决下拉菜单选中城市后无法获取正确ID的问题

问题根源

你当前的代码中,tempArray仅存储了过滤后的城市名称字符串,下拉菜单回调返回的index是这个临时字符串数组的索引。但你用该索引去原始城市数组中取值,而过滤后的数组索引与原数组完全不匹配,导致拿到错误的ID。

解决方案

核心思路是:保留过滤后的完整城市对象,而非仅存储名称,这样选中时可直接从对应对象中获取ID,无需依赖原数组索引。

步骤1:确保有城市模型(若未定义)

假设你还没定义城市数据模型,先添加一个符合JSON结构的Codable结构体:

struct City: Codable {
    let id: Int
    let city: String? // 考虑到字段可能为nil,使用可选类型
    let state_id: Int
}

步骤2:修改文本框编辑事件代码

修改cityTextFieldEditingChanged方法,存储过滤后的完整城市对象,并通过索引关联显示名称与对应对象:

@IBAction func cityTextFieldEditingChanged(_ sender: UITextField) {
    // 存储过滤后的完整城市对象
    var filteredCities = [City]()
    guard let searchText = sender.text?.lowercased(), !searchText.isEmpty else {
        // 搜索文本为空时清空下拉菜单
        showDropDown(with: [], from: sender) { _, _ in }
        return
    }
    
    // 用filter简化过滤逻辑,保留完整城市对象
    filteredCities = cityResultDict?.cities?.filter { city in
        city.city?.lowercased().contains(searchText) ?? false
    } ?? []
    
    // 提取城市名称用于下拉菜单显示(和filteredCities索引一一对应)
    let cityNames = filteredCities.compactMap { $0.city }
    
    showDropDown(with: cityNames, from: sender) { [weak self] (item, index) in
        guard let self = self else { return }
        self.locationTextField.text = item
        // 直接从过滤后的城市对象数组中取对应ID
        self.cityId = filteredCities[index].id
        print(item, self.cityId)
    }
}

关键优化点

  • 用filteredCities存储完整城市对象,与cityNames的索引完全对应,选中时直接取对应对象的ID即可
  • 用filter替代for循环,代码更简洁高效
  • 提前处理搜索文本的空值和大小写问题,避免重复解包
  • 使用[weak self]避免循环引用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:40:24