Swift艺术App中UITableView无法显示数组数据问题求助
问题诊断与修复方案
核心问题梳理
你的UITableView不更新的根源是数据源同步错误和表格刷新时机缺失,具体问题点如下:
artInfo数组仅在viewDidLoad初始化一次,后续搜索获取的新数据没有同步到这个表格依赖的数据源- 搜索按钮点击后,没有将查询到的数组数据转换为
artworkDetails对象存入artInfo - 搜索完成后未调用
tblSearchArtList.reloadData()通知表格刷新 - 初始数组的默认值(如
artName: [""])会导致无效数据混入
分步修复代码
1. 清理数组初始默认值
把所有存储查询结果的数组初始化为空数组,避免无效初始值干扰:
// Arrays that will store the data collected from a search using SQL. var artName:[String] = [] var artist:[String] = [] var artLocation:[String] = [] var artYear:[Int] = [] var artYearString:[String] = [] // Art Info Var var artInfo: [artworkDetails] = []
2. 重构搜索逻辑,同步更新artInfo
修改btnArtSearch方法,在查询完成后将数组数据转换为artworkDetails,并刷新表格:
@IBAction func btnArtSearch(_ sender: Any) { guard let typedArtName = txtArtNameField.text, let typedArtist = txtArtistNameField.text, let typedLocation = txtLocationField.text, let typedYear = txtYearField.text else { return } // 清空所有数据源数组 artName.removeAll() artist.removeAll() artLocation.removeAll() artYear.removeAll() artInfo.removeAll() // 同时清空artInfo // SQL查询(注意:直接拼接字符串有SQL注入风险,建议用参数绑定,学校项目可先简化) queryStatementString = "SELECT * FROM art_data WHERE art_name LIKE '%\(typedArtName)%' AND artist LIKE '%\(typedArtist)%' AND location LIKE '%\(typedLocation)%' AND installation_year LIKE '%\(typedYear)%' ORDER BY art_name ASC;" print("\(queryStatementString)") // 执行查询 queryArtInfomationList() // 将查询结果转换为artworkDetails对象,存入artInfo artYearString = artYear.map { String($0) } for i in 0..<artName.count { // 确保数组下标不越界 guard i < artist.count, i < artLocation.count, i < artYearString.count else { continue } let artwork = artworkDetails( artName: artName[i], artistName: artist[i], artLocation: artLocation[i], artDate: artYearString[i], artImage: artName[i] // 假设图片名和艺术名一致 ) artInfo.append(artwork) } // 刷新表格 tblSearchArtList.reloadData() print ("查询到\(artName.count)条结果") }
3. 简化viewDidLoad方法
移除viewDidLoad里初始化artInfo的代码,因为此时还没有查询数据,初始化也是无效的:
override func viewDidLoad() { super.viewDidLoad() // 设置表格代理和数据源(如果Storyboard里没绑定的话) tblSearchArtList.delegate = self tblSearchArtList.dataSource = self }
4. 修复didSelectRowAt的数据源
改用artInfo作为跳转时的数据源,避免和旧数组不一致:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let destinationVC = self.storyboard?.instantiateViewController(withIdentifier: "artInfoView") as! artInfoViewController savedArtName = artInfo[indexPath.row].artName // 改用artInfo的数据 self.present(destinationVC, animated: true, completion: nil) }
5. 优化queryArtInfomationList的数组判断逻辑
原代码里if artName != nil是多余的(数组永远不会为nil),直接append即可:
// STORE Swift version of results in the arrays. artName.append(artNameResult) artist.append(artistResult) artLocation.append(artLocationResult) artYear.append(artYearResult!)
额外建议
- SQL注入风险:不要直接拼接用户输入到SQL语句中,建议使用
sqlite3_bind_text等方法绑定参数,避免安全问题 - 空值处理:在
queryArtInfomationList中,artYearResult!强制解包可能崩溃,建议添加可选绑定处理 - 单元格复用检查:确保
searchArtDescriptionTableViewCell的所有IBOutlet都正确连接,没有断开
内容的提问来源于stack exchange,提问作者William TitanTermminator2 Flet
相关产品推荐
相关产品推荐

