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

如何通过SearchBar与for循环返回对象数组?TableView无结果排查

问题分析与解决方案

看起来你的核心问题出在数据源没有被正确更新,导致TableView没有数据可展示。我们一步步来排查和修复:

1. 核心问题:解码后未更新数据源

你的parseJSON方法成功解码了API返回的数据,但只做了打印,没有把解码后的结果赋值给listOfProducts——也就是TableView的数据源数组。这直接导致TableView一直显示空内容。

修改后的parseJSON方法:

func parseJSON(productTitle: Data) {
    let decoder = JSONDecoder()
    do {
        let decodedData = try decoder.decode(ProductResponse.self, from: productTitle)
        // 关键:将解码后的结果赋值给数据源数组
        self.listOfProducts = decodedData.results
        print("成功获取\(decodedData.results.count)条数据")
    } catch {
        print("JSON解码失败:\(error.localizedDescription)")
    }
}

2. 潜在问题:URL参数未编码

如果搜索关键词包含空格、中文或其他特殊字符,直接拼接URL会导致请求无效。建议对查询参数进行URL编码:

修改后的fetchProduct方法:

func fetchProduct(productName: String) {
    // 对搜索关键词进行URL安全编码
    guard let encodedProductName = productName.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
        print("搜索关键词编码失败")
        return
    }
    let urlString = "\(searchURL)&query=\(encodedProductName)&number=25"
    performRequest(urlString: urlString)
}

3. 其他需要确认的细节

  • SearchBar代理关联:确保productSearch已经正确关联到Storyboard/XIB中的SearchBar控件,否则searchBarSearchButtonClicked方法不会被触发。
  • Cell标识符匹配:确认Storyboard/XIB中TableViewCell的Identifier设置为"Cell",和你代码中dequeueReusableCell的参数一致。
  • API Base URL有效性:检查searchURL是否是完整且有效的HTTP/HTTPS地址,避免拼写错误。
  • 权限问题:如果你的API是HTTPS的,确保Info.plist中配置了ATS相关权限;如果是HTTP,需要添加例外域名。

做完这些修改后,再次测试搜索功能,应该就能看到TableView正确展示搜索结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:52:55