Swift 3.0中如何合并两个结构体并在UITableViewCell中显示其值
解决UITableView显示两个关联结构体数据的问题
首先,咱们先梳理下你现有代码里的几个核心问题:
- 行数计算逻辑错误:你把
mainCellData和companyData的数量相加,这会导致行数混乱——实际上每个职位(MainCell)对应一行,行数应该等于mainCellData.count。 - Cell赋值逻辑错误:你在
cellForRowAt里用for循环遍历所有职位,最后Cell会被最后一个职位的数据覆盖,完全没有对应到当前行的内容。 - 公司名称关联错误:
MainCell里只有company_id,没有name属性,你需要通过这个ID去companyData数组里匹配对应的公司信息。
修正方案(基础版)
先修改TableView的核心方法:
// 修正行数:每个职位对应一行 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return mainCellData.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 推荐用带indexPath的dequeue方法,更安全 let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath) as! JobDetails_TableViewCell // 获取当前行对应的职位数据 let currentJob = mainCellData[indexPath.row] // 赋值职位的基本信息 cell.lblDesig.text = currentJob.job_desig cell.lblDesc.text = currentJob.job_desc cell.lblLocation.text = currentJob.job_location // 根据company_id查找对应的公司 if let matchedCompany = companyData.first(where: { $0.company_id == currentJob.company_id }) { cell.comName.text = matchedCompany.company_name } else { // 找不到对应公司时显示默认文本 cell.comName.text = "未知公司" } return cell }
优化方案(性能提升版)
如果你的companyData数据量较大,每次在cellForRowAt里查找公司会影响性能,建议提前把职位和对应的公司关联成一个组合结构体:
// 创建组合结构体,把职位和公司信息绑定 struct JobWithCompany { let job: MainCell let company: Company? } // 声明组合数据数组 var jobWithCompanyData: [JobWithCompany] = []
在你获取到mainCellData和companyData之后,初始化这个组合数组:
// 假设你在网络请求完成后拿到了两个数组,执行以下代码 jobWithCompanyData = mainCellData.map { job in // 匹配对应公司 let company = companyData.first(where: { $0.company_id == job.company_id }) return JobWithCompany(job: job, company: company) }
然后修改TableView方法使用这个组合数组:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return jobWithCompanyData.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath) as! JobDetails_TableViewCell let currentItem = jobWithCompanyData[indexPath.row] cell.lblDesig.text = currentItem.job.job_desig cell.lblDesc.text = currentItem.job.job_desc cell.lblLocation.text = currentItem.job.job_location cell.comName.text = currentItem.company?.company_name ?? "未知公司" return cell }
这样就可以高效地在每个Cell里显示职位信息和对应的公司名称啦!
内容的提问来源于stack exchange,提问作者Juhi Danak
相关产品推荐
相关产品推荐

