我正致力于在多个"向下钻取"中显示来自plist的数据。 tableViews。显示的数据只是只读的,我不希望它必须基于网络数据,并且最多只有大约100个数据点,所以我对plist非常满意而不是JSON。
无论如何,这个问题......我已经得到了一系列字典项目,我能够很好地展示它们。我开始使用GitHub关于堆栈溢出的以下问题(我修改了一点但不重要)。
Load data from a plist to two TableViews
https://github.com/DonMag/SWPListData
我需要帮助的是在每个人下面显示一系列项目("朋友"在此示例中)。希望能解释下面的代码。
我在模型
中创建了一个空数组struct EmployeeDetails {
let functionary: String
let imageFace: String
let phone: String
//This is the new array I've added and am having trouble displaying
let friends: [String]
init(dictionary: [String: Any]) {
self.functionary = (dictionary["Functionary"] as? String) ?? ""
self.imageFace = (dictionary["ImageFace"] as? String) ?? ""
self.phone = (dictionary["Phone"] as? String) ?? ""
//I've initialised it here.
self.friends = (dictionary["Friends"] as? [String]) ?? [""]
现在在viewController中显示数据。我没有任何问题,显示"职员"," imageFace"的正确数据。和"电话" - 但我似乎无法展示"朋友"作为自己部分中的数组。我非常确定主要问题出在numberOfRows
和cellForRow
:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
if let theEmployee = newPage {
return theEmployee.details.count
}
return 0
}
else if section == 1 {
return 1
}
else if section == 2 {
if let theEmployee = newPage {
return theEmployee.details.count
}
return 0
}
else {
return 0
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // as! TableViewCell2
if indexPath.section == 0 {
cell.textLabel?.text = "A"
if let theEmployee = newPage {
cell.textLabel?.text = theEmployee.details[indexPath.row].functionary
cell.detailTextLabel?.text = theEmployee.details[indexPath.row].phone + " (" + theEmployee.details[indexPath.row].imageFace + ")"
}
}
else if indexPath.section == 1 {
cell.textLabel?.text = "Test"
}
else if indexPath.section == 2 {
cell.textLabel?.text = ????
}
return cell
}
我认为在numberOfRows
中编写以下内容会起作用:
else if section == 2 {
if let theEmployee = newPage {
return theEmployee.details.friends.count
}
return 0
}
但我收到错误:
类型' [员工详细信息]'没有会员'朋友'
获取该阵列需要做什么?
注意:数组不为空。
任何建议/帮助将不胜感激!
答案 0 :(得分:0)
问题是您正在访问详细信息上的friends属性,而它是存储在详细信息中的结构上的属性,因此您必须通过索引这样的内容来访问它
theEmployee.details[yourIndex].friends.count
<强>更新强>
//首先你需要在.plist文件中进行更改,请到那里添加Friends Array,就像Details
一样现在这将要求您更改Employee结构代码
struct Employee {
let position: String
let name: String
let details: [EmployeeDetails]
let friends: [String]
init(dictionary: [String: Any]) {
self.position = (dictionary["Position"] as? String) ?? ""
self.name = (dictionary["Name"] as? String) ?? ""
let t = (dictionary["Details"] as? [Any]) ?? []
self.details = t.map({EmployeeDetails(dictionary: $0 as! [String : Any])})
self.friends = (dictionary["Friends"] as? [String]) ?? []
}
}
下一步是在表格视图中添加如下
override func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let theEmployee = newPage {
if section == 0 {
return theEmployee.details.count
}else if section == 1 {
return theEmployee.friends.count
}
}
return 0
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if section == 0 {
return "Subordinates"
}else if section == 1 {
return "Friends"
}
return ""
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // as! TableViewCell2
cell.textLabel?.text = "A"
if let theEmployee = newPage {
if indexPath.section == 0 {
cell.textLabel?.text = theEmployee.details[indexPath.row].functionary
cell.detailTextLabel?.text = theEmployee.details[indexPath.row].phone + " (" + theEmployee.details[indexPath.row].imageFace + ")"
}else if indexPath.section == 1 {
cell.textLabel?.text = theEmployee.friends[indexPath.row]
}
}
return cell
}
}