在Objective-C中读取和更新plist

问题描述

我想让用户选择是否在登录页面上存储用户名,所以我的plist有2个键: userIsSaved(bool) username(string)
这是我的脚本:

Nsstring *path = [[NSBundle mainBundle] pathForResource:@"userinfo" ofType:@"plist"];
NSMutableDictionary *plistDic = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
BOOL userIsSaved = [[plistDic objectForKey:@"userIsSaved"] boolValue];
Nsstring *username = plistDic[@"username"];

if (lg.saveUserSwitch.isOn){

    if (userIsSaved == false){

        [plistDic setobject:[NSNumber numberWithBool:YES] forKey:@"userIsSaved"];
        plistDic[@"username"] = lg.usernameFld.text;

        [plistDic writetoFile: path atomically: YES];

        if ([plistDic writetoFile: path atomically: YES] == NO) {
            NSLog(@"!!!Save plist file Failed");
        }

    }

}

我有一些问题:

  1. 为什么我不能写plistDic[@"userIsSaved"] = true来更新bool值?如何正确更新呢? [plistDic setobject:[NSNumber numberWithBool:YES] forKey:@"userIsSaved"]似乎改变了它的类型。我应该怎么读?
  2. 我无法将plistDic写入plist。我不知道怎么了。
  3. @H_502_22@

    解决方法

    答案

    1. 您不能将布尔值(或整数,浮点数或...)存储到字典中-只能存储对象。因此,您需要先将其转换为对象,在本例中为NSNumber。您也可以使用 plistDic setObject:@(YES) forKey:@"userIsSaved"]

    2. 要首先写入,请获取正确目录的路径,该路径通常类似于

        NSURL * dir = [[NSFileManager.defaultManager URLsForDirectory:NSApplicationSupportDirectory
                                    inDomains:NSUserDomainMask].firstObject
                   URLByAppendingPathComponent:NSBundle.mainBundle.bundleIdentifier
                   isDirectory:YES];
    

    然后您可以使用类似 NSString * myFile = [dir.path stringByAppendingPathComponent:@"mylist.plist"];

    ,然后改为写入myFile

    注意使用URL也是一个好主意。