-1

以前は、次のコードを使用して配列を作成しましたが、うまくいきました。

bundle = [NSBundle mainBundle];
path = [bundle pathForResource:@"MultiSetting" ofType:@"plist"];    
settingArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

しかし、その後、plistファイルを変更したかったので、次のコードを使用してそれを行いましたが、機能しません。

NSFileManager *mgr = [NSFileManager defaultManager];
NSArray *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [documentPath objectAtIndex:0];
NSString *dstPath = [documentDirectory stringByAppendingPathComponent:@"MultiSetting.plist"];

bundle = [NSBundle mainBundle];
NSString *srcPath = [bundle pathForResource:@"MultiSetting" ofType:@"plist"];
NSError *error = nil;
[mgr copyItemAtPath:srcPath toPath:dstPath error:(NSError **)error];

settingArray = [[NSMutableArray alloc] initWithContentsOfFile:dstPath];
NSLog(@"%@", settingArray);

この問題を解決する解決策はありますか? 私は何か悪いことをしましたか?

4

2 に答える 2

0

errorあなたが間違っている最初のこと。その行を次のように変更する必要があります

[mgr copyItemAtPath:srcPath toPath:dstPath error:&error];

最初の実行後のコードによると、特定の名前のファイルが既に存在するため、上記の行は失敗します。一度だけ初期化したい場合は、以下のように書くとより理にかなっていると思います。

NSError *error = nil;
if (![mgr fileExistsAtPath:dstPath]) {
    [mgr copyItemAtPath:srcPath toPath:dstPath error:&error];
    if (error) {
        NSLog(@"%@",[error localizedDescription]);
    }
}

initWithContentsOfFile:plistを配列に解析できないため、最後に失敗する可能性があります。これは、plist ファイルのルート オブジェクトがディクショナリ (Xcode を使用して plist を作成するときのデフォルト) であることが原因である可能性があります。

バンドル内の plist ファイルを解析できるため、最初に誤って間違ったファイル (または空のファイルまたはルートを辞書として持つ plist) をコピーしてから、コピーできなかった可能性があります。そのため、からファイルを削除してからdstPath、もう一度やり直してください。

ファイルを確認するには、NSLogof dstPath. たとえば、コンソールに次のようなものが表示された場合:

/Users/xxxx/Library/Application Support/iPhone Simulator/5.0/Applications/194351E6-C64E-4CE6-8C82-8F66C8BFFAAF/Documents/YourAppName.app

これを Documents フォルダまでコピーします。

/Users/xxxx/Library/Application Support/iPhone Simulator/5.0/Applications/194351E6-C64E-4CE6-8C82-8F66C8BFFAAF/Documents/

次の場所に移動します。

ファインダー -> 移動 -> フォルダーへ移動

パスを貼り付けて をクリックしGoます。これにより、実際のディレクトリに移動し、 plist の内容を確認できます。Xcode でソース コードとして開き、ルート オブジェクトを確認します。

また、ここにあるこのファイルを削除して、アプリを実行してみてください。

上記を達成する別の方法は、バンドルから配列を初期化し、ファイルをコピーする代わりに直接書き込むことです(ただし、これは問題に対する直接的な答えではなく、単なる回避策です)。

NSString *srcPath = [bundle pathForResource:@"MultiSetting" ofType:@"plist"];
NSError *error = nil;
//initialize from source
NSMutableArray *settingsArray = [[NSMutableArray alloc] initWithContentsOfFile:srcPath];
//write to file
NSError *error = nil;
//check if file exists
if (![mgr fileExistsAtPath:dstPath]) {
    [settingArray writeToFile:dstPath atomically: YES];
    if (error) {
        NSLog(@"%@",[error localizedDescription]);
    }
}
于 2013-07-09T06:44:18.677 に答える
0

アレイに加えた変更はsettingArray、ディスクに自動的に保存されません。明示的にディスクに保存する必要があります。実際に変数の内容を保存したい場合はsettingArray、次を呼び出す必要があります。

[settingArray writeToFile:dstPath atomically: YES];
于 2013-07-09T05:10:06.933 に答える