调用 plist 的子项
Call subitems of a plist
这是我的 属性 列表:directory.plist
我想知道如何将子项调用成ViewController。这是我的实际 ViewController:
import UIKit
class Page1: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var positionLabel: UILabel!
@IBOutlet weak var phoneLabel: UILabel!
@IBOutlet weak var emailLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
Shared.instance.employees.forEach({
nameLabel.text = (("name:", [=10=].name) as? String)
print("name:", [=10=].name)
print("position:", [=10=].position)
print("phone:", [=10=].phone)
print("email:", [=10=].email)
print()
})
}
}
这是我正在使用的结构:
import UIKit
struct Employee {
let position: String
let name: String
let email: String
let phone: String
init(dictionary: [String: String]) {
self.position = dictionary["Position"] ?? ""
self.name = dictionary["Name"] ?? ""
self.email = dictionary["Email"] ?? ""
self.phone = dictionary["Phone"] ?? ""
}
}
struct Shared {
static var instance = Shared()
var employees: [Employee] = []
}
在 AppDelegate 里面我放了这个:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if let url = Bundle.main.url(forResource: "directory", withExtension: "plist"), let array = NSArray(contentsOf: url) as? [[String: String]] {
Shared.instance.employees = array.map{Employee(dictionary: [=12=])}
}
return true
我需要做什么才能调用 directory.plist 上的子项目?我指的是 key Details 中的项目。然后我想展示 Func1、Func2 和 Func3。
obs.:(这个func是functionary的缩写)
谢谢!
经过一些改动,现在我得到的子项目为零:debugger
您在应用程序委托中的代码没有问题。您只需要用另一个 属性 更新您的 Employee
结构来存储 Details
。但这也意味着您的员工字典不仅仅是字符串值字典。所以你需要更新代码来处理正确的值类型:
struct Employee {
let position: String
let name: String
let email: String
let phone: String
let details: [String:String]
init(dictionary: [String: Any]) {
self.position = (dictionary["Position"] as? String) ?? ""
self.name = (dictionary["Name"] as? String) ?? ""
self.email = (dictionary["Email"] as? String) ?? ""
self.phone = (dictionary["Phone"] as? String) ?? ""
self.details = (dictionary["Details"] as? [String:String]) ?? [:]
}
}
这是我的 属性 列表:directory.plist
我想知道如何将子项调用成ViewController。这是我的实际 ViewController:
import UIKit
class Page1: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var positionLabel: UILabel!
@IBOutlet weak var phoneLabel: UILabel!
@IBOutlet weak var emailLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
Shared.instance.employees.forEach({
nameLabel.text = (("name:", [=10=].name) as? String)
print("name:", [=10=].name)
print("position:", [=10=].position)
print("phone:", [=10=].phone)
print("email:", [=10=].email)
print()
})
}
}
这是我正在使用的结构:
import UIKit
struct Employee {
let position: String
let name: String
let email: String
let phone: String
init(dictionary: [String: String]) {
self.position = dictionary["Position"] ?? ""
self.name = dictionary["Name"] ?? ""
self.email = dictionary["Email"] ?? ""
self.phone = dictionary["Phone"] ?? ""
}
}
struct Shared {
static var instance = Shared()
var employees: [Employee] = []
}
在 AppDelegate 里面我放了这个:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if let url = Bundle.main.url(forResource: "directory", withExtension: "plist"), let array = NSArray(contentsOf: url) as? [[String: String]] {
Shared.instance.employees = array.map{Employee(dictionary: [=12=])}
}
return true
我需要做什么才能调用 directory.plist 上的子项目?我指的是 key Details 中的项目。然后我想展示 Func1、Func2 和 Func3。
obs.:(这个func是functionary的缩写)
谢谢!
经过一些改动,现在我得到的子项目为零:debugger
您在应用程序委托中的代码没有问题。您只需要用另一个 属性 更新您的 Employee
结构来存储 Details
。但这也意味着您的员工字典不仅仅是字符串值字典。所以你需要更新代码来处理正确的值类型:
struct Employee {
let position: String
let name: String
let email: String
let phone: String
let details: [String:String]
init(dictionary: [String: Any]) {
self.position = (dictionary["Position"] as? String) ?? ""
self.name = (dictionary["Name"] as? String) ?? ""
self.email = (dictionary["Email"] as? String) ?? ""
self.phone = (dictionary["Phone"] as? String) ?? ""
self.details = (dictionary["Details"] as? [String:String]) ?? [:]
}
}