我有一个使用iOS 9+的Contacts框架的应用程序。我制作了一个tableview,用户可以保存一些选定的联系人。我希望能够保留此联系人列表。做这个的最好方式是什么?我在考虑使用核心数据。
我的问题是联系人是“var Contacts = CNContact”因此不是NSManagedObject类型。我的印象是,使用核心数据保存数据时,变量必须是NSManagedObject类型,而我的变量是CNContact类型。
答案 0 :(得分:1)
以下是使用plists保存数据的示例。假设您有一个对象,例如" User"。例如,该用户具有用户名和密码。
然后在你的用户类中你应该有这样的东西:
class User: NSObject, NSCoding {
var username: String
var password: String
required init?(coder aDecoder: NSCoder) {
username = aDecoder.decodeObject(forKey: "Username") as! String
password = aDecoder.decodeObject(forKey: "Password") as! String
}
init(username: String, password: String, subjects: [Subject], colorPreferences: [Subject: UIColor], assessments: [Assessment]) {
self.username = username
self.password = password
}
func encode(with aCoder: NSCoder) {
aCoder.encode(username, forKey: "Username")
aCoder.encode(password, forKey: "Password")
}
}
然后你需要在viewController中做什么,你正在使用用户对象:
var loggedInUser: User?
class MyViewController: UIViewController {
func documentsDirectory() -> String {
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
return paths[0]
}
func dataFilePath() -> String {
return (documentsDirectory() as NSString).appendingPathComponent("AppInfo.plist") //name of your plist
}
func saveData() {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encodeObject(loggedInUser, forKey: "Logged In User") //whatever key you want
archiver.finishEncoding()
data.write(toFile: dataFilePath(), atomically: true)
}
func loadData() {
let path = dataFilePath()
if FileManager.default.fileExists(atPath: path){
if let data = NSData(contentsOfFile: path){
let unarchiver = NSKeyedUnarchiver(forReadingWith: data as Data)
loggedInUser = unarchiver.decodeObjectForKey("Logged In User") as? UserProfile
unarchiver.finishDecoding()
}
}
}
}
所以这是一个简化版本,但您应该能够调整它以保存您的CNContacts列表。如果有任何问题,请告诉我。我在自己的应用程序中使用此代码,因此它应该可以正常工作。