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

SwiftUI中如何从CloudKit选择数据并添加展示至视图?

实现选中搜索结果添加到保存列表的方案

1. 处理搜索列表的选中事件

在搜索列表的表格/集合视图代理方法里,捕获选中事件,把选中的国家加入保存列表,同时避免重复添加:

// 假设搜索结果数组为searchResults,保存列表数组为savedCountries,模型是Country
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedCountry = searchResults[indexPath.row]
    
    // 检查是否已存在,防止重复添加
    let isAlreadySaved = savedCountries.contains { $0.recordID == selectedCountry.recordID }
    if !isAlreadySaved {
        savedCountries.append(selectedCountry)
        // 刷新保存列表的UI
        saveListTableView.reloadData()
        // 收起键盘
        tableView.endEditing(true)
    }
    
    // 取消选中状态,和天气App交互一致
    tableView.deselectRow(at: indexPath, animated: true)
}

2. 持久化保存列表(可选但必要)

如果需要重启App后保留数据,推荐用UserDefaults(适合简单模型)或者同步到CloudKit:

用UserDefaults存储

先让Country模型遵守Codable协议:

struct Country: Codable {
    var recordID: CKRecord.ID
    var name: String
    // 其他你需要的属性
}

添加保存和读取方法:

// 保存到UserDefaults
func saveSavedCountries() {
    do {
        let encodedData = try JSONEncoder().encode(savedCountries)
        UserDefaults.standard.set(encodedData, forKey: "SavedCountries")
    } catch {
        print("保存失败:\(error.localizedDescription)")
    }
}

// 从UserDefaults读取(在viewDidLoad里调用)
func loadSavedCountries() {
    guard let savedData = UserDefaults.standard.data(forKey: "SavedCountries") else { return }
    do {
        savedCountries = try JSONDecoder().decode([Country].self, from: savedData)
        saveListTableView.reloadData()
    } catch {
        print("读取失败:\(error.localizedDescription)")
    }
}

同步到CloudKit(云端同步)

如果需要多设备同步,把选中的国家存到用户私有数据库:

func syncCountryToCloud(_ country: Country) {
    let savedRecord = CKRecord(recordType: "SavedCountry")
    savedRecord["countryName"] = country.name as NSString
    savedRecord["sourceRecordID"] = country.recordID.recordName as NSString
    
    let privateDB = CKContainer.default().privateCloudDatabase
    privateDB.save(savedRecord) { [weak self] _, error in
        guard error == nil else {
            print("云端同步失败:\(error!.localizedDescription)")
            return
        }
        // 回到主线程刷新UI
        DispatchQueue.main.async {
            self?.saveListTableView.reloadData()
        }
    }
}

3. 刷新保存列表UI

确保保存列表的数据源方法正确绑定savedCountries数组:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return savedCountries.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SaveListCell", for: indexPath)
    let targetCountry = savedCountries[indexPath.row]
    cell.textLabel?.text = targetCountry.name
    return cell
}

4. 模仿天气App的交互细节

  • 选中后自动返回保存列表页面:如果是用导航控制器push的搜索页面,添加navigationController?.popViewController(animated: true)
  • 可选:添加成功提示
let successAlert = UIAlertController(title: "已添加", message: "\(selectedCountry.name) 已加入你的列表", preferredStyle: .alert)
successAlert.addAction(UIAlertAction(title: "好的", style: .default))
present(successAlert, animated: true)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:25:17