Данные повторяются в разделе UItableview - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть UITableView с двумя разделами и четырьмя строками. Каждый раздел должен иметь две строки содержимого. Все работает нормально, за исключением того, что пункты повторяются в разделе 2:

enter image description here

Однако я хочу, чтобы это было так:

enter image description here

Мой код выглядит следующим образом:

swift 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
    }

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

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
}
0 голосов
/ 10 сентября 2018

Эти три строки:

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

Одно предупреждение: то, как вы структурируете данные, создает много проблем, если вы хотите, чтобы в каждом разделе было разное количество строк.

...