NSUserDefault问题。保存/检索数据,包括UIImageView网格[] []

时间:2011-07-16 11:54:22

标签: iphone xcode cocoa-touch

我正试图在游戏中保存信息,但我被卡住了。

在尝试使用NSUserDefault之前,我尝试了不同的方法。

我想要保存的是

* PlayerScore // NSInteger

* HighScore // NSInteger

*等级// NSInteger

*时间// int

* SFX和背景音乐上的按钮设置

*背景音乐的位置,所以它会在停止的地方恢复

*作为游戏场的网格及其上的砖块(网格为6x6,也是UIImageView * grid [] []类型,其上的砖块为35)

-(void)saveGameState {

NSLog(@"saveGameState");
NSLog(@"totalrubies %d", totalrubies);
NSLog(@"playerscore %d", playerscore);
NSLog(@"highscore %d", highscore);
NSLog(@"level %d", level);
NSLog(@"totalseconds %d", totalSeconds);

[[NSUserDefaults standardUserDefaults] setInteger:totalrubies forKey:kRubiesKey]; 
[[NSUserDefaults standardUserDefaults] setInteger:playerscore forKey:kPScoreKey];
[[NSUserDefaults standardUserDefaults] setInteger:highscore forKey:kHScoreKey];
[[NSUserDefaults standardUserDefaults] setInteger:level forKey:kLevelKey];
[[NSUserDefaults standardUserDefaults] setInteger:totalSeconds forKey:kTimeKey];
[[NSUserDefaults standardUserDefaults] synchronize];


for (int y = 0; y < BRICKHEIGHT; y++)
{
    for (int x = 0; x < BRICKWIDTH; x++) 
    {

        [[NSUserDefaults standardUserDefaults] setObject:grid[x][y] forKey:kGridKey];
        NSLog(@"grid[BRICKWIDTH][BRICKHEIGHT] %d", grid[x][y].tag);
    }
}

}

我也试过这种方式

NSData *ImageData = UIImagePNGRepresentation (grid[x][y]); [NSUserDefaults standardUserDefaults] setObject:ImageData forKey:kGridKey];

然后我收到一个警告:不兼容的Objective-C类型'struct UIImageView *',当从不同的Objective-C类型传递'UIImagePNGRepresentation'的参数1时,预期'struct UIImage *'

我认为,我已经设法保存除列表中最后3 *之外的所有内容。我需要帮助那些专门用于网格部分的人,这是prio 1。

2 个答案:

答案 0 :(得分:1)

您应该在UIImagePNGRepresentation()UIImage UIImageView,因此会出现此错误消息。

尝试:

UIImageView *imgView = grid[x][y];
NSData *ImageData = UIImagePNGRepresentation(imgView.image);
[NSUserDefaults standardUserDefaults] setObject:ImageData forKey:kGridKey];

答案 1 :(得分:0)

NSUserDefaults对此并不是一个很好的解决方案。您是否考虑过CoreData或文件系统?

保存图像本身似乎是不必要和浪费的。你所要做的就是记录游戏的状态 - 即哪个砖块在哪个位置。您应该能够轻松地从该数据重新创建视图。