2012-05-22 171 views
8

沙盒應用程序爲Mac App Store後,保存字符串文件爲NSSavePanel時出現問題。我將com.apple.security.files.user-selected.read-write設置爲YES,並且NSOpenPanel正常工作。沙盒應用程序沙盒後NSSavePanel未保存文件

當我嘗試保存新文件,不過,似乎一切正常,但隨後沒有保存的文件,它應該是....

這是我用來保存代碼該文件:

NSSavePanel *save = [NSSavePanel savePanel]; 

long int result = [save runModal]; 

if (result == NSOKButton) 
{ 
    NSString *selectedFile = [save filename]; 
    NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile]; 
    NSString *arrayCompleto = [[NSString alloc]initWithFormat:@"bla bla bla"]; 
    [arrayCompleto writeToFile:fileName 
        atomically:NO 
         encoding:NSUTF8StringEncoding 
         error:nil]; 
} 

回答

10

首先,-[NSSavePanel filename]選擇器已被棄用。改爲使用-[NSSavePanel URL]。其次,-[NSString writeToFile:atomically:encoding:error]告訴你你做錯了什麼是error:(NSError**)的論點。

您還應該特別處理文件I/O的錯誤,因爲即使您的代碼是100%正確的,用戶系統上仍可能存在錯誤(權限不足等),並將錯誤呈現給用戶將允許他們看到它失敗(並有一些想法爲什麼)。處理代碼中的錯誤也可以讓你的應用程序恢復。例如,如果您嘗試讀取粘貼的代碼下面的文件(在寫入磁盤後),但用戶嘗試將其寫入到他們無法訪問的網絡共享中,則您的應用可能會崩潰。如果您知道寫入失敗,則可以相應地進行操作(也許會提示另一個保存位置)。

在這種情況下,雖然,我相信下面一行是你的問題:

NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile]; 

當你的應用是沙箱,用戶需要給你權限,無論是特定文件或特定的一個目錄通過打開/保存面板將它們帶入您的沙箱。你正在做的是將用戶給你的文件寫入,並說「這很好,但我想保存一個不同的文件」,這違反了沙盒。你應該做的是在保存面板中設置擴展名。完整的固定的解決辦法是:

NSSavePanel *save = [NSSavePanel savePanel]; 
[save setAllowedFileTypes:[NSArray arrayWithObject:@"dat"]]; 
[save setAllowsOtherFileTypes:NO]; 

NSInteger result = [save runModal]; 

if (result == NSOKButton) 
{ 
    NSString *selectedFile = [[save URL] path]; 
    NSString *arrayCompleto = @"bla bla bla"; 

    NSError *error = nil; 
    [arrayCompleto writeToFile:selectedFile 
        atomically:NO 
         encoding:NSUTF8StringEncoding 
          error:&error]; 
} 

if (error) { 
    // This is one way to handle the error, as an example 
    [NSApp presentError:error]; 
} 

如果在別的未來什麼是錯的,你可以在運行時檢查error值。在調試時,在if (error)語句內設置一個斷點,以檢查error對象的值(在Xcode的調試器中執行po error)。這應該可以幫助你弄清楚什麼是錯的。

+0

非常感謝!它像一個魅力! 感謝您的幫助! Massy – Blue

+0

沒問題。我也忘了提及,每當你處理文件I/O時處理錯誤是一個特別好的做法,因爲即使你的代碼是100%正確的,用戶系統可能會有問題(權限不足等)。我補充說,答案。 – Dov

+0

您還可以設置提示的保存文件名,以便它不保存爲'無標題'文檔:[save setNameFieldStringValue:@「MySuggestedFilename」] –