2012-12-26 70 views
3

我只是一直在傾斜Cocoa/Objective C幾天,所以這可能很簡單/明顯,但它讓我難倒了。NSString writeToFile,NSSavePanel和寫入權限

我已經寫了這個處理程序來保存3個浮點數到一個文本文件。但是,當我運行它時,文件不會被保存。任何人都可以建議我的代碼中是否有錯誤,或者如果您認爲還有其他內容(如文件寫入權限)會阻止寫入文件。

研究讓我看到了沙盒,但這很容易混淆,我希望在調試時從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]; 
    } 
} 
+0

NSURL是沒有的NSString。您可以使用selectedFile.path屬性 –

+0

您正在附加文件擴展名。 –

回答

2

一個NSURL對象是沒有POSIX路徑..

其網址,並獲取其描述犯規使它路徑


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


但正如說,你不應該有到.TXT都追加。只是使用面板返回的內容。否則,因爲你沒有訪問權限修改文件名:)

NSString *fileName = selectedFile.path;

+0

感謝您的迴應。 NSString * fileName = selectedFile.path根據需要寫入文件,但沒有擴展名。使用stringByAppendingPathExtension寫入具有所需擴展名的文件。 – RichPorter

+0

@RichPorter:可能是因爲,如果問題中的代碼是準確的,那麼您沒有設置保存面板允許的文件類型。 –

+0

更好的是,使用'writeToURL:atomically:encoding:error:'。您不需要爲此提取路徑。 –

0

的問題是,你並不需要將文件擴展名追加到URL.The分機已there.You可以直接做到這一點:

if (result == NSOKButton) 
{ 
    [saveLens writeToURL: [save URL] 
       atomically:YES 
        encoding:NSUTF8StringEncoding 
        error:nil]; 
} 
+0

url在文件中返回一個描述:// scheme,no? (如果沒有生病,我當然會重新投票)。 –

+1

我最初假設擴展,但最壞的情況下,會有像foo.txt.txt文件或可見的沙箱錯誤 –

+0

嗯,我沒有用你提到的路徑進行測試。 –

1

我看你已經接受了答案有將sandboxd錯誤,但它也可能有助於瞭解如何調試這使用NSError指針的問題類型。

Cocoa使用NSError與方法調用產生錯誤條件,它豐富地封裝錯誤。 (Objective-C也有例外,但是它們是爲程序員錯誤的情況保留的,例如數組索引超出範圍,或者不應該是零參數。)

當您有一個方法接受錯誤指針,通常它還會返回一個指示整體成功或失敗的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]; 
} 
+0

這很好,我還沒有用NSError做過實驗。我試試看,謝謝。 – RichPorter