显示来自JSON数据的tableviewcell内的标签

如何解决显示来自JSON数据的tableviewcell内的标签

我正在使用Swift创建应用,我想在UITableViewCell内使用JSON解析显示一些标签,这是我想在我的应用中做的屏幕截图

Here is the screen shot i want to do like this

如屏幕截图Flat1所示,Flat2是我要在UITableVieCell中显示的标签,并用于显示我在下面使用的标签

This is the TagListView Which i have used

这是我的JSON数据,来自WebService

{
  "success": "1","data": [
    {
      "fk_project_surveyors_id": "1","number": 1,"created_date": "2020-04-17 10:09:57","sub_cores": [
        {
          "sub_cores_title": "Flat 1"
        }
      ],"signature": "img_sFZuFpUd011587136197.png","name": "Sean Clancy","inspections_id": "4","fk_user_id": "1","fk_cores_id": "12","survey_date": "2020-04-12"
    },{
      "fk_project_surveyors_id": "1","number": 2,"created_date": "2020-04-29 12:55:45","sub_cores": [
        {
          "sub_cores_title": "Flat 1"
        },{
          "sub_cores_title": "Flat 2"
        }
      ],"signature": "img_Ptw0bvSGfR1588182945.png","inspections_id": "6","number": 3,"created_date": "2020-05-06 06:08:11","signature": "img_FSUTzxT4221588763291.png","inspections_id": "7","number": 4,"created_date": "2020-06-15 04:25:16","signature": "img_EVqcz58zN11592213116.png","inspections_id": "8","number": 5,"created_date": "2020-06-21 11:04:56","signature": "img_3ySNyhAjYd1592755496.png","name": "ron","inspections_id": "10","number": 6,"created_date": "2020-06-21 11:05:44","signature": "img_ILSykgAIW71592755544.png","name": "ron2","inspections_id": "11","survey_date": "2020-04-12"
    }
  ],"message": ""
}

正如您在JSON数据中看到的那样,每个项目都具有sub_cores数组,因此我想从sub_cores_title中显示在TagListView内部的UITableViewCell

这是我用来解析JSON之上的模型结构

public struct HistoryModel{
    var fk_user_id: String?
    var signature: String?
    var fk_cores_id: String?
    var name: String?
    var inspections_id: String?
    var fk_project_surveyors_id: String?
    var created_date: String?
    var number: String?
    var survey_date: String?
    var sub_cores: [SubCoreModelData]
    
    public init(fk_user_id: String,signature: String,fk_cores_id: String,name: String,inspections_id: String,fk_project_surveyors_id: String,created_date: String,number: String,survey_date: String,sub_cores:[SubCoreModelData]) {
        self.fk_user_id = fk_user_id
        self.signature = signature
        self.fk_cores_id = fk_cores_id
        self.name = name
        self.inspections_id = inspections_id
        self.fk_project_surveyors_id = fk_project_surveyors_id
        self.created_date = created_date
        self.number = number
        self.survey_date = survey_date
        self.sub_cores = sub_cores
    }
}

public struct SubCoreModelData{
    var sub_core_title: String?
    
    public init(sub_core_title: String?) {
        self.sub_core_title = sub_core_title
    }
}

这是我的代码API调用函数,我从中将数据存储到数组

var historyData = HistoryModel

func historyAPI(){
        guard let uid = UserDefaults.standard.string(forKey: "uid") else { return }
        guard let accessToken = UserDefaults.standard.string(forKey: "accToken") else { return }
        guard let projectid = UserDefaults.standard.string(forKey: "propSurID") else { return }
        
        let params = ["user_id": uid,"access_token": accessToken,"project_surveyors_id": projectid,"cores_id": self.coreid]
        print(params)
        showHud(view: self.view,message: "Please Wait")
        AF.request(previousinspectionlist,method: .post,parameters: params).responseJSON(completionHandler: {(response) in
            switch response.result{
            case.success(let value):
                let json  = JSON(value)
                print(json)
                let data = json["data"]
                if data == []{
    
                }else{
                    self.historyData.removeAll()
                    for cat in data{
                        let fk_user_id = cat.1["fk_user_id"].stringValue
                        let name = cat.1["name"].stringValue
                        let signature = cat.1["signature"].stringValue
                        let fk_cores_id = cat.1["fk_cores_id"].stringValue
                        let inspections_id = cat.1["inspections_id"].stringValue
                        let fk_project_surveyors_id = cat.1["fk_project_surveyors_id"].stringValue
                        let created_date = cat.1["created_date"].stringValue
                        let number = cat.1["number"].stringValue
                        let survey_date = cat.1["survey_date"].stringValue


                        var arrOfItems = [SubCoreModelData]()
                        for ser in cat.1["sub_cores"] {
                            let subcore = SubCoreModelData(sub_core_title: ser.1["sub_cores_title"].stringValue)
                            arrOfItems.append(subcore)
                        }
                        self.historyData.append(HistoryModel(fk_user_id: fk_user_id,signature: signature,fk_cores_id: fk_cores_id,name: name,inspections_id: inspections_id,fk_project_surveyors_id: fk_project_surveyors_id,created_date: created_date,number: number,survey_date: survey_date,sub_cores: arrOfItems,collapsed: false))
                    }
                }
                self.tblListView.reloadData()
                dismissHud()
            case.failure(let error):
                basicErrorAlertWith(title: "Error",message: error.localizedDescription,controller: self)
                dismissHud()
            }
        })
    }

但是使用此代码,我在表视图中获取重复数据,所以任何人都可以告诉我如何为具有Sub Core标题的每一行设置标签,为此请帮我

TableviewDelegate和数据源代码

func numberOfSections(in tableView: UITableView) -> Int {
    return self.historyData.count
}
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    let items = self.historyData[section].sub_cores
    return items.count
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! InspectionHistoryTableViewCell
    cell.lblName.text = historyData[indexPath.row].name
    if let number = historyData[indexPath.row].number{
        print(number)
        cell.lblNumber.text = "#\(number)"
    }
    cell.lblSurveydate.text = historyData[indexPath.row].survey_date
    let items = self.historyData[indexPath.section].sub_cores
    let item = items[indexPath.row]
    if let subcore = item.sub_core_title{
        cell.tagList.addTag(subcore)
    }
    cell.selectionStyle = .none
    return cell
}

解决方法

似乎您在混淆数据模型。 对于historyData中的每个条目,您似乎都有一个小节;对于该历史数据中的每个sub_cores,看起来都想要一行。

但是您真正想要的只是一个带有historyData.count行的部分。

cellForRowAt:中,您将同时访问具有行索引和节索引的历史数据数组,这将导致数据混合,并且很可能很快崩溃。

因此,要更正cellForRowAt:,您只需访问每个行索引的历史数据,然后声明并使用所有sub_core填充标签视图。

这应该有效:

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    return self.historyData.count
}

func tableView (_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell    = tableView.dequeueReusableCell(withIdentifier: "Cell") as! InspectionHistoryTableViewCell
    let row     = indexPath.row
    let data    = historyData[row]
    
    cell.lblName.text = data.name

    if let number = data.number{
        print(number)
        cell.lblNumber.text = "#\(number)"
    }
    
    cell.lblSurveydate.text = data.survey_date
    let items = data.sub_cores
    cell.tagList.removeAllTags()
    for (item in items) {
        cell.tagList.addTag(item.sub_core_title)
    }
    
    cell.selectionStyle = .none
    return cell
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-