【问题标题】:Editing key inside array item - plist编辑数组项内的键 - plist
【发布时间】:2014-08-23 09:30:34
【问题描述】:

我有以下列表:

<?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];
}

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

【问题讨论】:

    标签: ios objective-c plist


    【解决方案1】:

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

        -(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 @"";
    }
    

    【讨论】:

    • 感谢您的回答!我已经尝试过了,但由于某种原因,我无法编辑/阅读任何信息。知道为什么吗? ://
    • 我已经用下面的命令测试了代码,它在我的最后工作正常。您可以尝试检查相同的 NSLog(@"%@", [self readInfoForSubHeadingName:@"Item 1 of table 1"]); [self updateInfo:@"Test 1" forSubHeadingName:@"Item 1 of table 1"]; NSLog(@"%@", [self readInfoForSubHeadingName:@"Item 1 of table 1"]); [self updateInfo:@"关于项目 1 的详细信息" forSubHeadingName:@"表 1 的项目 1"]; NSLog(@"%@", [self readInfoForSubHeadingName:@"Item 1 of table 1"]);
    • 还有一件事是您的文件存在于文档目录或应用程序包中(如果它位于应用程序包中),而不是您必须更改为 NSString *path = [[NSBundle mainBundle] pathForResource:@"DeviceInformation " ofType:@"plist"];
    • 呃,你是对的!抱歉,我以为我的文档目录中有 plist!非常感谢,它就像一个魅力:)
    【解决方案2】:

    您不能在 Dictionary 中编辑单个对象。您将再次必须编写完整的 plist。 为此,您可以做一件事。获取所有 plist 字典。将其保存在字典对象中。然后编辑您不想编辑的细节。然后再次将完整的字典写入 plist 并编辑详细信息。这是实现这一目标的唯一方法。

    【讨论】:

    • 我知道,这就是我使用NSMutableDictionary 的原因,我在其中加载plist,对其进行编辑,然后将其保存回plist 文件。但我的问题是尝试为包含特定 subHeadingName 的数组项编辑 subheadingDetail
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多