【问题标题】:Array of plist update dataplist 更新数据数组
【发布时间】:2013-05-04 11:13:11
【问题描述】:

我有这两个数组初始化两个不同的 plist 文件,plist 文件在文件夹中而不是在包中,所以是可编辑的。

progress = [[NSMutableArray alloc] initWithContentsOfFile:[self progressFilePath]];
    easy = [[NSMutableArray alloc] initWithContentsOfFile:[self easyFilePath]];

进度列表为空,简单的是:

<array>
    <dict>
        <key>TitleEN</key>
        <string>Hunter</string>
        <key>Status</key>
        <integer>0</integer>
        <key>Image</key>
        <string></string>
    </dict>
</array>

现在在我看来,我有一个很容易加载的 tableView,我希望元素按在行中,如果它的状态为 0,它会进入进度 plist,为 dog.png 中的键 Image 设置对象正在进行中。 plist 还为关键状态设置了对象 0,但很简单。我用这个做了一切:

NSNumber *status = [[easy objectAtIndex:indexPath.row] objectForKey:@"Status"];
    if ([status intValue] == 0) {

            [progress addObject:[easy objectAtIndex:indexPath.row]];

        int progresstot = [progress count];
        for (int i=0; i<progresstot; i++) {
            if ([[progress objectAtIndex:i] objectForKey:@"TitleEN"] == [[easy objectAtIndex:indexPath.row] objectForKey:@"TitleEN"]) {
                [[progress objectAtIndex:i] setObject:@"dog.png" forKey:@"Image"];
            }
        }
            [progress writeToFile:[self progressFilePath] atomically:YES];
[[easy objectAtIndex:indexPath.row] setObject:[NSNumber numberWithInt:1]        forKey:@"Status"];
             [easy writeToFile:[self easyFilePath] atomically:YES];
      }

一切正常,但我不明白为什么在这个方法的最后我有我的progress.plist 和我的元素和dog.png,但我也有dog.png 在简单的那个。 (状态仅更新为 easy 并且运行良好,但 dog.png 在两者上)。 任何人都可以帮助我吗?我不明白出了什么问题。

【问题讨论】:

    标签: iphone xcode arrays sdk plist


    【解决方案1】:
    [progress addObject:[easy objectAtIndex:indexPath.row]];
    

    您将对象 p1 == [easy objectAtIndex:indexPath.row] 添加到进度数组,现在进度数组保留 p1 并将其作为其元素之一.它没有创建新对象,而是保留了现有对象 - p1。

    for (int i=0; i<progresstot; i++) {
        if ([[progress objectAtIndex:i] objectForKey:@"TitleEN"] == 
                [[easy objectAtIndex:indexPath.row] objectForKey:@"TitleEN"]) 
        {
            [[progress objectAtIndex:i] setObject:@"dog.png" forKey:@"Image"];
        }
    }
    
    • 我猜,在 if 语句中,您想比较对象的内容,而不是指针。
    • 再一次,在两个数组中,您都有指向同一个对象的指针 (p1),所以当您执行 [p1 setObject:forKey:]; 时 - 执行此操作两个数组。

    【讨论】:

    • 明白!如何复制进度数组中的简单对象?
    • 好吧,既然你正在使用经典的objective-C对象(从NSObject派生),你可以这样做 NSObject *itemToAdd=[[easy objectAtIndex:indexPath.row] copy]; [进度添加对象:itemToAdd]; [itemToAdd release]; 我们发布了 itemToAdd,因为数组会保留它,我们不想在之后泄漏 复制的 item
    • 它不起作用,显示此错误。 '由于未捕获的异常 NSInternalInconsistencyException 导致应用程序终止,原因:-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 另外我无法释放 *itemToAdd 因为我正在使用 ARC
    • 啊,如果您使用的是 ARC,那么只需 [progress addObject:[[easy objectAtIndex:indexPath.row] mutableCopy]]; 是的,因为您工作对于可变对象,必须使用 mutableCopy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2012-08-27
    相关资源
    最近更新 更多