まず、mainBundle には何も書き込めません。plist に書き込むには、それをドキュメント ディレクトリにコピーする必要があります。これは次のように行われます。
- (void)createEditableCopyOfIfNeeded
{
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"Template.plist"];
success = [fileManager fileExistsAtPath:writablePath];
if (success)
return;
// The writable file does not exist, so copy from the bundle to the appropriate location.
NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Template.plist"];
success = [fileManager copyItemAtPath:defaultPath toPath:writablePath error:&error];
if (!success)
NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]);
}
したがって、この関数を呼び出すと、ドキュメント ディレクトリにファイルが存在するかどうかがチェックされます。そうでない場合は、ファイルをドキュメント ディレクトリにコピーします。ファイルが存在する場合は、単に返されます。次に、ファイルにアクセスして読み書きできるようにするだけです。アクセスするには、ドキュメント ディレクトリへのパスが必要で、ファイル名をパス コンポーネントとして追加するだけです。
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"Template.plist"];
plist からデータを取得するには:
NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
ファイルをドキュメント ディレクトリに書き戻します。
[array writeToFile:filePath atomically: YES];