Reputation: 536
I have a UITableView with two sections and four rows. Each section is supposed to have two rows content. It all works fine except for the fact that the items are repeated in section 2:
However, I want to have it like this:
My code looks as follows:
swift 4
// structure for serverData type
struct serverData {
var structHosts: String
var structStatusImagesMain: String
var structServerStatusMain: String
}
The variables to fill cells and sections:
// 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 ")
]
These are the table configurations:
// 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
}
Upvotes: 0
Views: 195
Reputation: 780
1) First you have to create struct for section data
Struct SectionData {
Let title: String
Let data: [serverData]
}
// structure for serverData type
struct serverData {
var structHosts: String
var structStatusImagesMain: String
var structServerStatusMain: String
}
2) then we fill data for every section title
// 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)confuguration tableView
// 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
}
Upvotes: 1
Reputation: 93141
These three lines:
lblDescribtion.text = myServerInfo[indexPath.row].structHosts
imgServer.image = UIImage(named: myServerInfo[indexPath.row].structStatusImagesMain)
lblServerStatus.text = myServerInfo[indexPath.row].structServerStatusMain
There are 2 sections, each with 2 rows in your table. They map to an array of 4 elements. So index.section
goes from 0 to 1, index.row
also goes from 0 to 1, meaning 4 total, matching the length of the array.
You need to do that translation correctly:
let index = indexPath.section * 2 + indexPath.row
lblDescribtion.text = myServerInfo[index].structHosts
imgServer.image = UIImage(named: myServerInfo[index].structStatusImagesMain)
lblServerStatus.text = myServerInfo[index].structServerStatusMain
One warning though: the way you structure the data means a lot of troubles if you want each section to have differing number of rows.
Upvotes: 1