Saya pikir saya tahu apa yang menyebabkan kesalahan ini, tetapi sepertinya saya tidak tahu apa yang saya lakukan salah.
Inilah pesan kesalahan lengkap yang saya dapatkan:
Mencoba menetapkan objek daftar non-properti ( "<BC_Person: 0x8f3c140>" ) sebagai nilai NSUserDefaults untuk key personDataArray kunci
Saya memiliki Person
kelas yang menurut saya sesuai dengan NSCoding
protokol, di mana saya memiliki kedua metode ini di kelas pribadi saya:
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.personsName forKey:@"BCPersonsName"];
[coder encodeObject:self.personsBills forKey:@"BCPersonsBillsArray"];
}
- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.personsName = [coder decodeObjectForKey:@"BCPersonsName"];
self.personsBills = [coder decodeObjectForKey:@"BCPersonsBillsArray"];
}
return self;
}
Di beberapa titik di aplikasi, NSString
di BC_PersonClass
diatur, dan saya memiliki DataSave
kelas yang saya pikir menangani pengkodean properti di saya BC_PersonClass
. Berikut adalah kode yang saya gunakan dari DataSave
kelas:
- (void)savePersonArrayData:(BC_Person *)personObject
{
// NSLog(@"name of the person %@", personObject.personsName);
[mutableDataArray addObject:personObject];
// set the temp array to the mutableData array
tempMuteArray = [NSMutableArray arrayWithArray:mutableDataArray];
// save the person object as nsData
NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
// first add the person object to the mutable array
[tempMuteArray addObject:personEncodedObject];
// NSLog(@"Objects in the array %lu", (unsigned long)mutableDataArray.count);
// now we set that data array to the mutable array for saving
dataArray = [[NSArray alloc] initWithArray:mutableDataArray];
//dataArray = [NSArray arrayWithArray:mutableDataArray];
// save the object to NS User Defaults
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:dataArray forKey:@"personDataArray"];
[userData synchronize];
}
Saya harap ini kode yang cukup untuk memberi Anda ide tentang apa yang saya coba lakukan. Sekali lagi saya tahu masalah saya terletak pada bagaimana saya mengkodekan properti saya di kelas BC_Person saya, saya sepertinya tidak bisa mencari tahu apa yang saya lakukan meskipun salah.
Terima kasih untuk bantuannya!
sumber
that I think is conforming to the NSCoding protocol
sangat mudah untuk menambahkan pengujian unit untuk itu, dan sangat berharga.Jawaban:
Kode yang Anda posting mencoba untuk menyimpan array objek khusus
NSUserDefaults
. Kamu tidak bisa melakukan itu MenerapkanNSCoding
metode tidak membantu. Anda hanya dapat menyimpan hal-hal sepertiNSArray
,NSDictionary
,NSString
,NSData
,NSNumber
, danNSDate
diNSUserDefaults
.Anda perlu mengonversi objek menjadi
NSData
(seperti yang Anda miliki di beberapa kode) dan menyimpannyaNSData
diNSUserDefaults
. Anda bahkan dapat menyimpan salahNSArray
satuNSData
jika perlu.Ketika Anda membaca kembali array Anda harus membatalkan pengarsipan
NSData
untuk mendapatkan kembaliBC_Person
objek Anda .Mungkin Anda menginginkan ini:
sumber
NSMutableArray
meluasNSArray
. Tidak apa-apa untuk meneruskanNSMutableArray
ke metode apa pun yang mengharapkanNSArray
. Perlu diingat bahwa array yang disimpan sebenarnyaNSUserDefaults
tidak akan berubah ketika Anda membacanya kembali.Sepertinya agak boros bagi saya untuk menjalankan melalui array dan mengkodekan objek ke dalam NSData sendiri. Kesalahan anda
BC_Person is a non-property-list object
memberi tahu Anda bahwa kerangka kerja tidak tahu cara membuat serial objek objek Anda.Jadi semua yang diperlukan adalah untuk memastikan bahwa objek orang Anda sesuai dengan NSCoding maka Anda dapat dengan mudah mengkonversi array objek kustom Anda ke NSData dan menyimpannya ke default. Inilah taman bermain:
Sunting : Menulis ke
NSUserDefaults
rusak pada Xcode 7 sehingga taman bermain akan mengarsipkan ke data dan kembali dan mencetak output. Langkah UserDefaults disertakan jika diperbaiki pada titik berikutnyaDan Voila, Anda telah menyimpan array objek kustom ke NSUserDefaults
sumber
func encode(with aCoder: NSCoder)
Untuk menyimpan:
Mendapatkan:
Untuk Hapus
sumber
Solusi Swift 3
Kelas utilitas sederhana
Kelas Model
Bagaimana cara menelepon
sumber
Swift- 4 Xcode 9.1
coba kode ini
Anda tidak dapat menyimpan mapper di NSUserDefault, Anda hanya dapat menyimpan NSData, NSString, NSNumber, NSDate, NSArray, atau NSDictionary.
sumber
Pertama, jawaban rmaddy (di atas) benar: implementasi
NSCoding
tidak membantu. Namun, Anda perlu menerapkanNSCoding
untuk menggunakanNSKeyedArchiver
dan semua itu, jadi itu hanya satu langkah lagi ... mengkonversi melaluiNSData
.Metode contoh
Jadi, Anda dapat membungkus
NSCoding
benda Anda di dalamNSArray
atauNSDictionary
...sumber
Saya mengalami masalah saat mencoba menyimpan kamus ini ke
NSUserDefaults
. Ternyata itu tidak akan disimpan karena mengandungNSNull
nilai. Jadi saya hanya menyalin kamus ke dalam kamus yang bisa diubah menghapus nulls kemudian disimpanNSUserDefaults
Dalam hal ini saya tahu kunci mana yang mungkin menjadi
NSNull
nilai.sumber
The Pref struct kebiasaan pembungkus di UserDefaults objek standar.
Jadi Anda bisa menggunakannya dengan cara ini:
sumber
if let data = UserDefaults.standard.data(forKey: keyUser) {
dan Btw casting dariUser
keUser
tidak ada gunanya hanyareturn try JSONDecoder().decode(User.self, from: data)
Cepat dengan
@propertyWrapper
Simpan
Codable
objek keUserDefault
Contoh Model pengguna mengonfirmasi Codable
Bagaimana cara menggunakannya
sumber
sumber
Swift 5 Cara Sangat Mudah
sumber