在表视图中显示来自 plist 的数据数组
Displaying an array of data from plist in tableview
我正在努力在多个 "drill down" tableView 中显示来自 plist 的数据。显示的数据只会是只读的,我不希望它一定基于网络数据,而且最多只有大约 100 个数据点,所以我对 plist 而不是 JSON.
无论如何,问题...我有一组字典项目,我设法很好地显示它们。我从 GitHub 开始,与以下有关堆栈溢出的问题有关(我对其进行了一些修改,但这并不重要)。
https://github.com/DonMag/SWPListData
我需要帮助的是在每个人下面显示一组项目(本例中为 "friends")。希望下面的代码可以解释。
我在模型中创建了一个空数组
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显示数据。我在显示 "functionary"、"imageFace" 和 "phone" 的正确数据时完全没有任何问题 - 但我似乎无法将 "friends" 显示为数组在它自己的部分。我很确定主要问题出在 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
}
但我收到错误消息:
value of type '[EmployeeDetails]' has no member 'friends'.
我需要做什么才能得到那个数组?
注意:数组不为空
任何 suggestions/help 将不胜感激!
问题是您正在访问朋友 属性 的详细信息,而它是 属性 存储在详细信息中的结构,因此您必须通过索引这样的东西来访问它
theEmployee.details[yourIndex].friends.count
更新:
//首先你需要在.plist文件里面做一些修改,请去那里像Details一样在里面添加Friends Array
现在这将要求您更改您的 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: [=11=] as! [String : Any])})
self.friends = (dictionary["Friends"] as? [String]) ?? []
}
}
下一步是将其添加到 table 视图中,如下所示
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
}
}
我正在努力在多个 "drill down" tableView 中显示来自 plist 的数据。显示的数据只会是只读的,我不希望它一定基于网络数据,而且最多只有大约 100 个数据点,所以我对 plist 而不是 JSON.
无论如何,问题...我有一组字典项目,我设法很好地显示它们。我从 GitHub 开始,与以下有关堆栈溢出的问题有关(我对其进行了一些修改,但这并不重要)。
https://github.com/DonMag/SWPListData
我需要帮助的是在每个人下面显示一组项目(本例中为 "friends")。希望下面的代码可以解释。
我在模型中创建了一个空数组
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显示数据。我在显示 "functionary"、"imageFace" 和 "phone" 的正确数据时完全没有任何问题 - 但我似乎无法将 "friends" 显示为数组在它自己的部分。我很确定主要问题出在 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
}
但我收到错误消息:
value of type '[EmployeeDetails]' has no member 'friends'.
我需要做什么才能得到那个数组?
注意:数组不为空
任何 suggestions/help 将不胜感激!
问题是您正在访问朋友 属性 的详细信息,而它是 属性 存储在详细信息中的结构,因此您必须通过索引这样的东西来访问它
theEmployee.details[yourIndex].friends.count
更新:
//首先你需要在.plist文件里面做一些修改,请去那里像Details一样在里面添加Friends Array
现在这将要求您更改您的 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: [=11=] as! [String : Any])})
self.friends = (dictionary["Friends"] as? [String]) ?? []
}
}
下一步是将其添加到 table 视图中,如下所示
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
}
}