NSUserDefaultsにカスタムオブジェクトを保存する [重複] [重複
2023-10-02 22:15:10
質問
お知らせがあります
ViewController
と
TeamViewController
. は
TeamViewController
には teamObjects の tableView が含まれており、選択されると配列に追加されます。この配列を
NSUserDefaults
からアクセスできるように
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
このようにTeamを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")
}
}
関連
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Swift カスタムオブジェクトの配列をプロパティ値でソートする方法
-
[解決済み] Swiftの配列を文字列に変換するには?
-
[解決済み] swiftで電子メールアドレスを検証する方法は?
-
[解決済み】NSUserDefaultsをクリアする。
-
[解決済み】NSUserDefaultsにカスタムオブジェクトを格納する方法
-
[解決済み】NSUserDefaultsに文字列を保存しますか?
-
[解決済み】保存されたNSUserDefaultsを見る簡単な方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] iOSシミュレータでスクリーンショットを撮る
-
[解決済み] UIButtonのタイトルを左揃えにするにはどうしたらよいですか?
-
[解決済み] 「GCC使用時に「Xcode/iOSのライセンスに同意するには管理者権限が必要です。rootでsudoを使用して再実行してください。
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。
-
[解決済み】NSUserDefaultsにカスタムオブジェクトを格納する方法
-
[解決済み] NSUserdefaultsの配列の保存と読み込みはどのように行うのですか?
-
[解決済み] NSCodingを使用したSwiftのカスタムクラスをUserDefaultsに保存する