Attempt to set a non-property-list object as an NSUserDefaults

前端 未结 11 1630
闹比i
闹比i 2020-11-22 15:00

I thought I knew what was causing this error, but I can\'t seem to figure out what I did wrong.

Here is the full error message I am getting:

Attempt to se         


        
相关标签:
11条回答
  • 2020-11-22 15:43

    The code you posted tries to save an array of custom objects to NSUserDefaults. You can't do that. Implementing the NSCoding methods doesn't help. You can only store things like NSArray, NSDictionary, NSString, NSData, NSNumber, and NSDate in NSUserDefaults.

    You need to convert the object to NSData (like you have in some of the code) and store that NSData in NSUserDefaults. You can even store an NSArray of NSData if you need to.

    When you read back the array you need to unarchive the NSData to get back your BC_Person objects.

    Perhaps you want this:

    - (void)savePersonArrayData:(BC_Person *)personObject {
        [mutableDataArray addObject:personObject];
    
        NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
        for (BC_Person *personObject in mutableDataArray) { 
            NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
            [archiveArray addObject:personEncodedObject];
        }
    
        NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
        [userData setObject:archiveArray forKey:@"personDataArray"];
    }
    
    0 讨论(0)
  • 2020-11-22 15:44

    Swift 3 Solution

    Simple utility class

    class ArchiveUtil {
    
        private static let PeopleKey = "PeopleKey"
    
        private static func archivePeople(people : [Human]) -> NSData {
    
            return NSKeyedArchiver.archivedData(withRootObject: people as NSArray) as NSData
        }
    
        static func loadPeople() -> [Human]? {
    
            if let unarchivedObject = UserDefaults.standard.object(forKey: PeopleKey) as? Data {
    
                return NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [Human]
            }
    
            return nil
        }
    
        static func savePeople(people : [Human]?) {
    
            let archivedObject = archivePeople(people: people!)
            UserDefaults.standard.set(archivedObject, forKey: PeopleKey)
            UserDefaults.standard.synchronize()
        }
    
    }
    

    Model Class

    class Human: NSObject, NSCoding {
    
        var name:String?
        var age:Int?
    
        required init(n:String, a:Int) {
    
            name = n
            age = a
        }
    
    
        required init(coder aDecoder: NSCoder) {
    
            name = aDecoder.decodeObject(forKey: "name") as? String
            age = aDecoder.decodeInteger(forKey: "age")
        }
    
    
        public func encode(with aCoder: NSCoder) {
    
            aCoder.encode(name, forKey: "name")
            aCoder.encode(age, forKey: "age")
    
        }
    }
    

    How to call

    var people = [Human]()
    
    people.append(Human(n: "Sazzad", a: 21))
    people.append(Human(n: "Hissain", a: 22))
    people.append(Human(n: "Khan", a: 23))
    
    ArchiveUtil.savePeople(people: people)
    
    let others = ArchiveUtil.loadPeople()
    
    for human in others! {
    
        print("name = \(human.name!), age = \(human.age!)")
    }
    
    0 讨论(0)
  • 2020-11-22 15:46

    Swift- 4 Xcode 9.1

    try this code

    you can not store mapper in NSUserDefault, you can only store NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary.

    let myData = NSKeyedArchiver.archivedData(withRootObject: myJson)
    UserDefaults.standard.set(myData, forKey: "userJson")
    
    let recovedUserJsonData = UserDefaults.standard.object(forKey: "userJson")
    let recovedUserJson = NSKeyedUnarchiver.unarchiveObject(with: recovedUserJsonData)
    
    0 讨论(0)
  • 2020-11-22 15:52

    https://developer.apple.com/reference/foundation/userdefaults

    A default object must be a property list—that is, an instance of (or for collections, a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary.

    If you want to store any other type of object, you should typically archive it to create an instance of NSData. For more details, see Preferences and Settings Programming Guide.

    0 讨论(0)
  • 2020-11-22 15:59

    I had this problem trying save a dictionary to NSUserDefaults. It turns out it wouldn't save because it contained NSNull values. So I just copied the dictionary into a mutable dictionary removed the nulls then saved to NSUserDefaults

    NSMutableDictionary* dictionary = [NSMutableDictionary dictionaryWithDictionary:dictionary_trying_to_save];
    [dictionary removeObjectForKey:@"NullKey"];
    [[NSUserDefaults standardUserDefaults] setObject:dictionary forKey:@"key"];
    

    In this case I knew which keys might be NSNull values.

    0 讨论(0)
提交回复
热议问题