将IBAction连接到objective-c中的菜单项时出错

时间:2013-12-31 04:12:46

标签: objective-c xcode debugging interface-builder

在Xcode中制作的mac的Objective-c程序中,我有保存和加载保存文件的方法。这些方法运行正常,但是当我尝试将其操作连接到菜单栏项目(即“文件”菜单下的“保存并加载”)时,保存已停止工作。它正确运行了该方法,但实际上并没有保存到保存文件中。

当我从菜单栏项目中断开操作并将其恢复到以前的状态时,它仍然无法正常工作。

这是Xcode的一个错误,如果你超过了默认的保存和加载操作吗?因为现在我的程序坏了,我无法找到解决方法。

方法中的代码与此类似:

- (IBAction)saveGame: (id)sender{ // saving the game
    [self saveAlert];
    NSString *saveFileContents = [NSString stringWithFormat:@"#%d #%d", int1, int2];
    NSString *file_path = [[NSBundle mainBundle] pathForResource:@"save" ofType:@"txt"];
    NSString *whatWrite = [NSString stringWithFormat:@"%@",saveFileContents];
    [whatWrite writeToFile:file_path atomically:YES encoding:NSUTF8StringEncoding error:Nil];
    self.feedLabel.stringValue = @"You just saved";
}


- (IBAction)loadGame: (id)sender{ //loading the save
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"save" ofType:@"txt"];
    NSString *aString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:Nil];
    NSMutableArray *substrings = [NSMutableArray new];
    NSScanner *scanner = [NSScanner scannerWithString:aString];
    [scanner scanUpToString:@"#" intoString:nil];

    while(![scanner isAtEnd]) {
        NSString *substring = nil;
        [scanner scanString:@"#" intoString:nil];
        if([scanner scanUpToString:@" " intoString:&substring]) {
            [substrings addObject:substring];
        }
        [scanner scanUpToString:@"#" intoString:nil];
    }

    int1 = [[substrings objectAtIndex:0] intValue];
    int2 = [[substrings objectAtIndex:1] intValue];
}

当我运行程序并保存时,它表示已保存并且方法[self saveAlert]按预期运行。但是,当我加载时,它会加载一个保存文件,当没有被覆盖的保存时(即加载时不先保存),该保存文件是默认的保存文件。因此,问题可能是储蓄存在问题?

当我在一个单独的程序中运行代码时,代码工作得非常好,在我将操作连接到文件菜单之前保存并加载,所以我认为问题不存在。

如果您需要更多信息,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

现有代码不会覆盖save.text文件的原因是应用程序无法覆盖其资源。

这是包含应用程序本身的bundle目录。不要在此目录中写任何内容。为防止篡改,bundle目录在安装时签名。写入此目录会更改签名并阻止您的应用程序再次启动。

而是写入您的文档目录。您可以像这样获取文档目录的路径:

NSString * docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

你只需将你的save.text文件复制如下

请注意,iOS上的NSHomeDirectory()简单地返回应用程序包的路径。获得文档目录的路径后,您可以写入资源,例如save.text,如下所示:

NSString * path = [docsDir stringByAppendingPathComponent:@"save.text"];
[myString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

您可以在文档目录中随时编辑文件。

参考:-[NSString writeToFile:] does not change the contents of the file