【问题标题】:Data repeats in section of UItableviewUItableview 部分中的数据重复
【发布时间】:2018-09-10 18:30:58
【问题描述】:

我有一个包含两个部分和四行的 UITableView。每个部分应该有两行内容。 除了这些项目在第 2 节中重复之外,一切正常:

但是,我想要这样:

我的代码如下:

斯威夫特 4

// structure for serverData type
struct serverData {
    var structHosts: String
    var structStatusImagesMain: String
    var structServerStatusMain: String
}

填充单元格和部分的变量:

// data filled in my array "section" and in my array "myServerInfo" of type serverData    
let sections = ["Section 1", "Section 2"]
let myServerInfo = [
    serverData(structHosts: "www.google.com", structStatusImagesMain: "error", structServerStatusMain: "Error "), 
    serverData(structHosts: "www.amazon.com", structStatusImagesMain: "error", structServerStatusMain: "Error "), 
    serverData(structHosts: "www.ebay.com", structStatusImagesMain: "error", structServerStatusMain: "Error "), 
    serverData(structHosts: "www.apple.comt", structStatusImagesMain: "error", structServerStatusMain: "Error ")
]

这些是表格配置:

// table functions    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sections[section]
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = serverStatusTable.dequeueReusableCell(withIdentifier: "serverStatusCell", for: indexPath)

        let lblDescribtion : UILabel = cell.contentView.viewWithTag(6) as! UILabel
        let lblServerStatus : UILabel = cell.contentView.viewWithTag(8) as! UILabel
        let imgServer : UIImageView = cell.contentView.viewWithTag(7) as! UIImageView

                if myServerInfo .isEmpty {
                    print("myServerInfo is empty: ", myServerInfo)
                } else {
                    lblDescribtion.text = myServerInfo[indexPath.row].structHosts
                    imgServer.image = UIImage(named: myServerInfo[indexPath.row].structStatusImagesMain)
                    lblServerStatus.text  = myServerInfo[indexPath.row].structServerStatusMain
                }

        return cell
    }

【问题讨论】:

  • 首先将您的数据模型组织成一个数组,与您希望它在表格视图中的显示方式相匹配。
  • 重复输出是因为您没有考虑indexPathsection 属性。顺便说一句:viewWithTag 已经过时了几年。在 IB 中设计一个自定义单元并使用 outlet。

标签: arrays swift uitableview sections


【解决方案1】:

这三行:

lblDescribtion.text = myServerInfo[indexPath.row].structHosts
imgServer.image = UIImage(named: myServerInfo[indexPath.row].structStatusImagesMain)
lblServerStatus.text  = myServerInfo[indexPath.row].structServerStatusMain

表格中有 2 个部分,每个部分有 2 行。它们映射到一个由 4 个元素组成的数组。所以index.section 从 0 到 1,index.row 也从 0 到 1,意味着总共 4 个,与数组的长度相匹配。

您需要正确地进行翻译:

let index = indexPath.section * 2 + indexPath.row

lblDescribtion.text = myServerInfo[index].structHosts
imgServer.image = UIImage(named: myServerInfo[index].structStatusImagesMain)
lblServerStatus.text  = myServerInfo[index].structServerStatusMain

但有一个警告:如果您希望每个部分具有不同的行数,那么构建数据的方式会带来很多麻烦。

【讨论】:

    【解决方案2】:

    1) 首先你必须为部分数据创建结构

    Struct SectionData {
         Let title: String
         Let data: [serverData]
    

    }

    // structure for serverData type
    struct serverData {
        var structHosts: String
        var structStatusImagesMain: String
        var structServerStatusMain: String
    }
    

    2) 然后我们为每个部分的标题填充数据

        // data filled in my array "section" and in my array "myServerInfo" of type serverData    
    
    let myServerInfo = [SectionData]()
    Let section1 = SectionData(title: "section1", data: 
        serverData(structHosts: "www.google.com", structStatusImagesMain: "error", structServerStatusMain: "Error "), 
        serverData(structHosts: "www.amazon.com", structStatusImagesMain: "error", structServerStatusMain: "Error "))
    
    Let section2 = SectionData(title: "section2", data: 
        serverData(structHosts: "www.ebay.com", structStatusImagesMain: "error", structServerStatusMain: "Error "), 
        serverData(structHosts: "www.apple.comt", structStatusImagesMain: "error", structServerStatusMain: "Error "))
    
    myServerInfo.append(section1)
    myServerInfo.append(section2)
    

    3)配置表视图

    // table functions    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return myServerInfi[section].title
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return myServerInfo.count
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myServerInfo[section].data.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = serverStatusTable.dequeueReusableCell(withIdentifier: "serverStatusCell", for: indexPath)
    
        let lblDescribtion : UILabel = cell.contentView.viewWithTag(6) as! UILabel
        let lblServerStatus : UILabel = cell.contentView.viewWithTag(8) as! UILabel
        let imgServer : UIImageView = cell.contentView.viewWithTag(7) as! UIImageView
    
                if myServerInfo .isEmpty {
                    print("myServerInfo is empty: ", myServerInfo)
                } else {
                    lblDescribtion.text = myServerInfo[indexPath.section][indexPath.row].structHosts
                    imgServer.image = UIImage(named: myServerInfo[indexPath.section][indexPath.row].structStatusImagesMain)
                    lblServerStatus.text  = myServerInfo[indexPath.section][indexPath.row].structServerStatusMain
                }
    
        return cell
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多