目标C从文件读取数组在不同位置失败

时间:2013-09-19 09:36:55

标签: objective-c macos

我正在开发一个mac应用程序,我想将我的设置(字符串数组)放入一个文件中。如果该文件与应用程序存在于同一文件夹中,则会覆盖默认设置。

编写文件时没有问题,但在使用代码阅读时没有问题:

NSArray* settingsInput = [[NSArray alloc] initWithContentsOfFile:@"./SettingsFile"];
发生了一些奇怪的事情。从XCode运行应用程序时(设置文件位于应用程序旁边的build / debug文件夹中)设置被读取没有问题。当我存档应用程序并从桌面运行它时,无法加载该文件。即使我将应用程序从构建文件夹复制到桌面也无法正常工作。

这种行为可能是什么原因?我该如何阅读此文件?

3 个答案:

答案 0 :(得分:3)

使用普通的prefence系统可能是一个更好的主意。 NSUserDefaults的。

有几种方法可以做到。 但我们的想法是为您的应用程序提供一组默认首选项,这些首选项在正确的域中注册并始终使用新的应用程序。

使用 registerDefaults :来自 NSUserDefaults

请参阅Apples文档NSUserDefaults及其#registerDefaults

但我要使用的是:

将plist文件复制到Xcode项目中的支持​​文件中。

enter image description here

确保选中“将文件复制到目标组的文件夹”。而且“添加到目标也是检查”

enter image description here

plist文件应该包含你的字符串数组。

enter image description here

(我创建了我的。通过在我的用户首选项中复制另一个plist。重命名它。将其复制到项目中。选择它并将其编辑为我需要它。确保我使用文件菜单 - >'保存'保存更改。)

声明NSUserDefaults * prefs;

enter image description here

现在在应用程序的 - (id)init方法中。您将文件的内容注册为默认首选项。

- (id)init
{
    self = [super init];
    if (self) {


        prefs = [NSUserDefaults standardUserDefaults] ;
        NSString *registerDefaultsPlistFile= [[NSBundle mainBundle] pathForResource:@"registerDefaults" ofType:@"plist"];
  [prefs registerDefaults:[NSDictionary dictionaryWithContentsOfFile: registerDefaultsPlistFile]];


    }
    return self;
}

您可以稍后拨打电话阅读这些偏好。

 NSLog(@" arrayOfStrings =   %@",  [prefs objectForKey:@"arrayOfStrings" ]);

除非您对其进行更改,否则不会将这些默认首选项写入文件/输出。通过写入文件我的意思是应用程序首选项文件。一旦你对它们进行了更改,那么它们将被写入用户首选项,这些将从那时开始使用。

答案 1 :(得分:2)

您不应该依赖应用的当前目录。您应该从应用程序包中读取(请参阅NSBundle类以获取正确的路径)或应用程序的文档目录(请参阅NSSearchPathForDirectoriesInDomains(NSDocumentDirectory ...)。

答案 2 :(得分:1)

当前工作目录的UNIX概念在Mac桌面应用程序中并不常用。通过Finder启动应用程序时,通常会将其设置为启动卷的根目录。

您应该找到另一种方法来确定设置文件的位置。好点是~/Library/Preferences~/Library/Application Support/MyApp。您可以使用以下命令获取这些目录的绝对路径:

NSString *path = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomain, YES)[0];