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

