ニュースViewController
とTeamViewController
があります。 TeamViewController
には、選択時に配列に追加されるteamObjectsのtableViewが含まれます。この配列をNSUserDefaults
に追加して、teamObjectsが必要なurl要求を含むNewsController
からそれらにアクセスできるようにします。しかし、私は取得し続けます:
「主要チームに非プロパティリストオブジェクト( "")を挿入しようとしています」
NSUserDefaults
に保存するよりも良い方法があれば、他の提案も受け付けています。
didSelectRowAtIndexPath
メソッド
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let team = self.teamArray[indexPath.row] as Team
var removed = false
for (index, value) in enumerate(self.teamSelected) {
if (value == team) {
self.teamSelected.removeAtIndex(index)
removed = true
}
}
if (!removed) {
self.teamSelected.append(team)
}
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setValue(self.teamSelected, forKey: "teams")
userDefaults.synchronize()
tableView.reloadData()
}
私のオブジェクト
class Team: NSObject{
var id: Int!
var name: NSString!
var shortname: NSString!
init(id: Int, name:NSString, shortname: NSString) {
self.id = id
self.name = name
self.shortname = shortname
}
}
実際には、カスタムオブジェクトをNSData
にアーカイブしてから、ユーザーデフォルトに保存し、ユーザーデフォルトから取得して、再度アーカイブ解除する必要があります。このようにアーカイブできます
let teams = [Team(id: 1, name: "team1", shortname: "t1"), Team(id: 2, name: "team2", shortname: "t2")]
var userDefaults = UserDefaults.standard
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: teams)
userDefaults.set(encodedData, forKey: "teams")
userDefaults.synchronize()
このように展開します
let decoded = userDefaults.data(forKey: "teams")
let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Team]
しかし、あなたがそれをしただけなら、あなたは得るでしょう
.Team encodeWithCoder:]: unrecognized selector sent to instance
このようにNSCodingにチームを適合させる必要があります
class Team: NSObject, NSCoding {
var id: Int
var name: String
var shortname: String
init(id: Int, name: String, shortname: String) {
self.id = id
self.name = name
self.shortname = shortname
}
required convenience init(coder aDecoder: NSCoder) {
let id = aDecoder.decodeInteger(forKey: "id")
let name = aDecoder.decodeObject(forKey: "name") as! String
let shortname = aDecoder.decodeObject(forKey: "shortname") as! String
self.init(id: id, name: name, shortname: shortname)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(id, forKey: "id")
aCoder.encode(name, forKey: "name")
aCoder.encode(shortname, forKey: "shortname")
}
}
次のようにNSKeyedUnarchiverを試すことができます
ここでは、UserDefaultにUIColorオブジェクトを保存しました。オブジェクトで変更できます。
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];
そしてそれを取得する
NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
注:これはObjective Cですが、これをSwiftで隠せることを願っています
これで問題が解決することを願っています