2

これを解決しようとして髪を引っ張ります。プロジェクト内の txt ファイルに数値のリストを読み書きしたいと考えています。ただし、 [string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error] は、ファイルに何も書き込まないようです。パス文字列がファイルパスを返すので、それを見つけたように見えますが、ファイルに何も書き込んでいないようです。

+(void)WriteProductIdToWishList:(NSNumber*)productId {

    for (NSString* s in [self GetProductsFromWishList]) {
        if([s isEqualToString:[productId stringValue]]) {
            //exists already
            return;
        }
    }

    NSString *string = [NSString stringWithFormat:@"%@:",productId];   // your string
    NSString *path = [[NSBundle mainBundle] pathForResource:@"WishList" ofType:@"txt"];
    NSError *error = nil;
    [string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
    NSLog(@"%@", error.localizedFailureReason);


    // path to your .txt file
    // Open output file in append mode: 
}

編集:パスは /var/mobile/Applications/CFC1ECEC-2A3D-457D-8BDF-639B79B13429/newAR.app/WishList.txt として表示されるため、存在します。しかし、それを読み返す:

NSString *path = [[NSBundle mainBundle] pathForResource:@"WishList" ofType:@"txt"];

空の文字列のみを返します。

4

2 に答える 2

10

アプリケーション バンドル内の場所に書き込もうとしていますが、バンドルは読み取り専用であるため変更できません。書き込み可能な場所 (アプリケーションのサンドボックス内) を見つける必要があります。そうすれば、 を呼び出したときに期待する動作が得られますstring:WriteToFile:

多くの場合、アプリケーションは最初の実行時にバンドルからリソースを読み取り、そのファイルを適切な場所 (ドキュメント フォルダーまたは一時フォルダーを試してください) にコピーしてから、ファイルの変更に進みます。

たとえば、次のようなものです。

// Path for original file in bundle..
NSString *originalPath = [[NSBundle mainBundle] pathForResource:@"WishList" ofType:@"txt"];
NSURL *originalURL = [NSURL URLWithString:originalPath];

// Destination for file that is writeable
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSURL *documentsURL = [NSURL URLWithString:documentsDirectory];

NSString *fileNameComponent = [[originalPath pathComponents] lastObject];
NSURL *destinationURL = [documentsURL URLByAppendingPathComponent:fileNameComponent];

// Copy file to new location
NSError *anError;
[[NSFileManager defaultManager] copyItemAtURL:originalURL
                                        toURL:destinationURL
                                        error:&anError];

// Now you can write to the file....
NSString *string = [NSString stringWithFormat:@"%@:", yourString]; 
NSError *writeError = nil;
[string writeToFile:destinationURL atomically:YES encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@", writeError.localizedFailureReason);

今後 (時間の経過とともにファイルを変更し続けたいと仮定すると)、ファイルがユーザーのドキュメント フォルダーに既に存在するかどうかを評価し、必要な場合にのみバンドルからファイルをコピーするようにする必要があります (そうでない場合は、変更したファイルを元のバンドル コピーで毎回上書きします)。

于 2013-05-10T16:58:17.987 に答える
2

特定のディレクトリ内のファイルに書き込む手間から逃れるには、NSUserDefaultsクラスを使用してキーと値のペアを保存/取得します。そうすれば、64歳になっても髪が残っています。

于 2013-05-10T17:47:24.647 に答える