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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:37:35