ios - 编辑数组项内的键 - plist

标签 ios objective-c plist

我有以下 plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Table 1</key>
    <dict>
        <key>subheadingArr</key>
        <array>
            <dict>
                <key>subheadingName</key>
                <string>Item 1 of table 1</string>
                <key>subheadingDetail</key>
                <string>Detail of item 1</string>
            </dict>
            <dict>
                <key>subheadingName</key>
                <string>Item 2 of table 1</string>
                <key>subheadingDetail</key>
                <string>Detail of item 2</string>
            </dict>
        </array>
    </dict>
    <key>Table 2</key>
    <dict>
        <key>subheadingArr</key>
        <array>
            <dict>
                <key>subheadingDetail</key>
                <string>Item 1 of table 2</string>
                <key>subheadingName</key>
                <string>Detail of item 1</string>
            </dict>
            <dict>
                <key>subHeadingDetail</key>
                <string>Item 2 of table 2</string>
                <key>subheadingName</key>
                <string>Detail of item 2</string>
            </dict>
        </array>
    </dict>
</dict>
</plist>

我正在尝试编写和阅读

我已经制作了这两种方法,试图为特定的 subheadingName 读写 subheadingDetail,但它们是错误的/不完整的,无法让它工作。

-(void)updateInfo:(NSString *)info forSubHeadingName:(NSString *)subheadingName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"DeviceInformation.plist"];
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:path];

    [data setObject:info forKey:subheadingName];

    [data writeToFile:path atomically:YES];
}

-(NSString *)readInfoForSubHeadingName:(NSString *)subheadingName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"DeviceInformation.plist"];
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:path];

    return [data objectForKey:subheadingDetail];
}

尝试搜索答案,但找不到与我的问题类似的内容。 提前致谢。

最佳答案

您可以通过递归遍历所有字典和数组来做到这一点。下面是解决您的问题的示例代码。

    -(void)updateInfo:(NSString *)info forSubHeadingName:(NSString *)subheadingName
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"DeviceInformation.plist"];
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
    [self processAndSetObject:data parent:subheadingName Info:info];
    [data writeToFile:path atomically:YES];
}

-(NSString *)readInfoForSubHeadingName:(NSString *)subheadingName
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"DeviceInformation.plist"];
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:path];

    return [self processParsedObject:data parent:subheadingName];
}

-(void) processAndSetObject:(id)object parent:(NSString*)strKey Info:(NSString *)info
{
    if([object isKindOfClass:[NSDictionary class]])
    {
        if([object objectForKey:@"subheadingName"] != nil)
        {
            if([[object valueForKey:@"subheadingName"] isEqualToString:strKey])
            {
                [object setValue:info forKeyPath:@"subheadingDetail"];
                return;
            }
        }
        for(NSString * key in [object allKeys])
        {
            id child = [object objectForKey:key];
            [self processAndSetObject:child parent:strKey Info:info];
        }
    }
    else if([object isKindOfClass:[NSArray class]])
    {
        for(id child in object)
        {
            [self processAndSetObject:child parent:strKey Info:info];
        }
    }
}

-(NSString *) processParsedObject:(id)object parent:(NSString*)strKey
{
    if([object isKindOfClass:[NSDictionary class]])
    {
        if([object objectForKey:@"subheadingName"] != nil)
        {
            if([[object valueForKey:@"subheadingName"] isEqualToString:strKey])
            {
                return [object valueForKey:@"subheadingDetail"];
            }
        }
        for(NSString * key in [object allKeys])
        {
            id child = [object objectForKey:key];
            NSString *aStrRetVal = [self processParsedObject:child parent:strKey];
            if(aStrRetVal.length > 0)
            {
                return aStrRetVal;
            }
        }
    }
    else if([object isKindOfClass:[NSArray class]])
    {
        for(id child in object)
        {
            NSString *aStrRetVal = [self processParsedObject:child parent:strKey];
            if(aStrRetVal.length > 0)
            {
                return aStrRetVal;
            }
        }
    }

    return @"";
}

关于ios - 编辑数组项内的键 - plist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25460511/

相关文章:

objective-c - 如何解决仍然为零的委托(delegate)

ios - 使用企业许可证在*任何* iphone 上安装应用程序

iphone - NSPredicate 用于在关系实体中搜索

nested - 通用 Lisp : Appending a nested plist efficiently

ios - 更新 .plist 中的字段

ios - 存储 NSString 的最佳方式是什么?

ios - 静态 TableView 的错误

ios - 当按下 2 倍快时,performSegueWithIdentifier 会推送两个 ViewController

objective-c - NSTokenField 中的自定义标记

iphone - 在二维数组中使用 NSPredicate