"尝试设置非属性列表对象...."NSMutableDictionary与自定义类

 曾理Aiheqihao_227 发布于 2023-02-08 13:27

我有一个自定义类ServerModule,它是一个子类NSObject.我基本上将所有这些ServerModule与一个键值对存储在一起NSMutableDictionary.然后存储字典NSUserDefaults.我了解到NSUserDefaults只有在访问对象时才会返回对象的不可变版本,因此我将字典初始化更改为:

_AllModules = [[NSMutableDictionary alloc]initWithDictionary:[_editServerModules objectForKey:@"AllModules"]]; //initialize a copy of AllModules dictionary

现在,我只是想ServerModule在这个字典中存储一个自定义对象,并进行同步.以下代码尝试执行此操作:

//Create new ServerModule
        ServerModule* newServer = [[ServerModule alloc]initWithUUID];
        newServer.name = self.tf_name.text;
        newServer.ip = self.tf_ip.text;
        newServer.port = self.tf_port.text;
        newServer.username = self.tf_user.text;
        newServer.password = self.tf_pass.text;
        //Add the ServerModule to AllModules dictionary with the key of its identifier
        [_AllModules setObject:newServer forKey:newServer.identifier];
        [self updateData];
        [_editServerModules synchronize];

标识符是在构造函数中设置的字符串ServerModule.这是代码updateData.

[_editServerModules setObject:_AllModules forKey:@"AllModules"];

如果您想知道,对象at @"AllModules"在AppDelegate中初始化如下:

NSMutableDictionary* AllModules = [[NSMutableDictionary alloc]init];

再一次,这是我在尝试保存时遇到的错误:

Attempt to set a non-property-list object {
    "42E9EEA0-9051-4E2A-81EA-DC8FC5639C26" = "";
} as an NSUserDefaults value for key AllModules

谢谢你的帮助!

〜Carpetfizz

1 个回答
  • 您只能存储属性列表类型(数组,数据,字符串,数字,日期,字典)或URL NSUserDefaults.这意味着所有内容(包括任何嵌套字典值)都必须是属性列表类型.您需要NSCodingServerModule对象上实现协议,然后NSKeyedArchiver在存储数据之前使用序列化数据,并NSKeyedUnarchiver在读取数据后对数据进行放气NSUserDefaults.

    例如,假设您显示的属性存在于ServerModule对象上,我会在NSCoding您的ServerModule实现中添加以下协议方法:

    #pragma mark - NSCoding support
    -(void)encodeWithCoder:(NSCoder*)encoder {
        [encoder encodeObject:self.name forKey:@"name"];
        [encoder encodeObject:self.ip forKey:@"ip"];
        [encoder encodeObject:self.port forKey:@"port"];
        [encoder encodeObject:self.username forKey:@"username"];
        [encoder encodeObject:self.password forKey:@"password"];
    }
    
    -(id)initWithCoder:(NSCoder*)decoder {
        self.name = [decoder decodeObjectForKey:@"name"];
        self.ip = [decoder decodeObjectForKey:@"ip"];
        self.port = [decoder decodeObjectForKey:@"port"];
        self.username = [decoder decodeObjectForKey:@"username"];
        self.password = [decoder decodeObjectForKey:@"password"];
        return self;
    }
    

    然后你当然需要序列化:

    NSData* archivedServerModules = [NSKeyedArchiver archivedDataWithRootObject:_AllModules];
    [_editServerModules setObject:archivedServerModules forKey:@"AllModules"];
    

    适当放气:

    NSData* archivedServerModules = [_editServerModules objectForKey:@"AllModules"];
    NSDictionary* serverModules = [NSKeyedUnarchiver unarchiveObjectWithData:archivedServerModules];
    

    希望这可以让你了解我在说什么.

    2023-02-08 13:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有