1

我正在尝试为我正在构建的 iphone 应用程序保存数据。我的数据结构是保存一个包含单个 gameArray 的 gamesArray。在每个 gameArray 中,我都有一个日期、姓名、主场/客场和一个 shotArray。shotArray 包含镜头。加载时的镜头创建 UIButtons 以显示在屏幕上。shotButtonArray 包含这些按钮。当我在 plist 编辑器中查看我的文件时,我看不到不同的数组。我只看到 1 个数组,并且所有创建的对象都刚刚列出。为什么它只显示一个数组。这是我保存数据的方式

for (UIButton *button in shotButtonArray) {

        assert([button isKindOfClass:[UIButton class]]);
        [button removeFromSuperview];
    }
    for (Shot *shot in shotArray) {
        [shot subtract_miss_And_make];
    }
    [self reDrawShots];
    [shotButtonArray removeAllObjects];
    [shotArray removeAllObjects];
    [gameArray removeAllObjects];
    [gameArray addObject:theDate];
    [gameArray addObject:theName];
    NSNumber *theNumber = [NSNumber numberWithInt:homeAway];
    [gameArray addObject:theNumber];
    [gameArray addObject:shotArray];
    gameNumber = 0;
    [gamesArray addObject:gameArray];
    NSString *path = [self findGamesPath];
    [NSKeyedArchiver archiveRootObject:gamesArray toFile:path];

我是否错误地保存了我的数据。为什么它只显示一个数组。

4

1 回答 1

1

您保存它的方式在技术上没有任何问题。我很困惑;为什么要在将 shotArray 保存到 gameArray 之前从 shotArray 中删除所有对象?另外,为什么你在 gamesArray 中只存储一个 gameArray?

即使您保存它的方式没有任何问题,我也会建议一种更好的方法来做到这一点。您应该创建一个代表“游戏”的新类。这可以使用键和值保存您想要的属性,例如日期、名称、数字等。如果您覆盖该类中的 -(void)encodeWithCoder:(NSCoder*)coder 函数,您可以调用:

[coder encodeObject:theData forKey:@"DATE"];
[coder encodeInteger:theNumber forKey:@"NUMBER"];

然后,当您覆盖 - (void)encodeWithCoder:(NSCoder *)encoder 时,您可以访问该值调用:

theDate = [[coder decodeObjectForKey:@"DATE"] retain];
theNumber = [coder decodeObjectForKey:@"NUMBER"];

这样,您可以只创建这些对象的数组,要求 NSKeyedArchiver 将数组归档为其根对象,所有内容都将在“游戏”类中干净地处理。如果您想存储其他更复杂的值,您可以创建其他类并使用 encodeObject 和 decodeObject 函数。

您可以在这里查看更多信息:http: //developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html

于 2011-04-23T22:51:19.130 回答