3

私はCocoa/Objective Cを数日間学習しているだけなので、これはおそらく単純で明白ですが、困惑していることをお詫びします。

3つのfloatをテキストファイルに保存するためにこのハンドラーを作成しました。しかし、私がそれを実行しているとき、ファイルは保存されていません。私のコードにエラーがあるかどうか、またはファイルの書き込みを妨げる何か(ファイルの書き込み権限など)があると思われる場合は、誰かが提案できますか?

調査の結果、サンドボックスを調べるようになりましたが、すぐに混乱してしまいます。デバッグでxcodeからアプリを実行するだけで、ユーザーディレクトリに書き込むことができるようになることを期待しています。

コードは次のとおりです。

- (IBAction)saveResultsAction:(id)sender {

    //Sets up the data to save
    NSString *saveLens = [NSString stringWithFormat:@"Screen width is %.02f \n Screen Height is %.02f \n Lens is %.02f:1",
        self.myLens.screenWidth,
        self.myLens.screenHeight,
        self.myLens.lensRatio];

    NSSavePanel *save = [NSSavePanel savePanel];

    long int result = [save runModal];

    if (result == NSOKButton) {
        NSURL *selectedFile = [save URL];
        NSLog(@"Save URL is %@", selectedFile);
        NSString *fileName = [[NSString alloc] initWithFormat:@"%@.txt", selectedFile];
        NSLog(@"Appended URL is %@", fileName);
        [saveLens writeToFile:fileName
                   atomically:YES
                     encoding:NSUTF8StringEncoding
                        error:nil];
    }
}
4

3 に答える 3

2

NSURLオブジェクトはPOSIXパスではありません。

そのURLとその説明を取得しても、パスにはなりません


NSString *fileName = [selectedFile.path stringByAppendingPathExtension:@"txt"];


ただし、前述のように、.txtを追加する必要はまったくありません。パネルが返すものを使用するだけです。そうしないと、変更されたファイル名へのアクセス権がないため、サンドボックスエラーが発生します:)

NSString *fileName = selectedFile.path;

于 2012-12-26T18:16:33.063 に答える
1

問題は、ファイル拡張子をURLに追加する必要がないことです。拡張子はすでに存在します。これを直接行うことができます。

if (result == NSOKButton)
{   
    [saveLens writeToURL: [save URL]
                atomically:YES
                  encoding:NSUTF8StringEncoding
                     error:nil];
}
于 2012-12-26T17:27:29.103 に答える
1

すでに回答を受け入れているようですが、NSErrorポインタを使用してこのタイプの問題をデバッグする方法を知っておくと役立つ場合があります。

CocoaはNSError、エラーを豊富にカプセル化するエラー条件を生成するメソッド呼び出しで使用します。(Objective-Cにも例外がありますが、これらは、範囲外の配列インデックスや、決して存在してはならないnilパラメーターなどのプログラマーエラーの場合のために予約されています。)

エラーポインタを受け入れるメソッドがある場合、通常はBOOL全体的な成功または失敗を示すものも返します。詳細情報を取得する方法は次のとおりです。

NSError *error = nil;
if (![saveLens writeToFile:fileName
                atomically:YES
                  encoding:NSUTF8StringEncoding
                     error:&error]) {
    NSLog(@"error: %@", error);
}

あるいは:

NSError *error = nil;
if (![saveLens writeToFile:fileName
                atomically:YES
                  encoding:NSUTF8StringEncoding
                     error:&error]) {
    [NSApp presentError:error];
}
于 2012-12-26T23:59:37.890 に答える