如何通过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
相关产品推荐
相关产品推荐

