2012-05-22 18 views
8

Uygulamayı Mac App Store için korumalı alana taşıdıktan sonra bir dize dosyasına NSSavePanel kaydederek bir sorun yaşıyorum. com.apple.security.files.user-selected.read-write'u YES'a ayarlıyorum ve NSOpenPanel olması gerektiği gibi çalışıyor. NSSavePanel, bir uygulamayı korumalı bir dosyaya kaydettikten sonra bir dosya kaydetmiyor

Ben yeni bir dosya kaydetmeyi deneyin

olsa da, her şey iyi çalışıyor gibi görünüyor ama sonra olması gerektiği Kaydedilmiş dosya ....

Bu benim kurtarmak için kullanıyorum kodudur var dosya: Herşeyden

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]; 
} 

cevap

10

Öncelikle -[NSSavePanel filename] seçici kullanımdan kaldırılmıştır. Bunun yerine -[NSSavePanel URL] kullanın. İkincisi, -[NSString writeToFile:atomically:encoding:error]'un yanlış yaptığınızı söyleme biçimi error:(NSError**) bağımsız değişkenidir.

Özellikle I/O dosyalarının hatalarını ele almalısınız, çünkü kodunuz% 100 doğru olsa bile, kullanıcının sisteminde hatalar olabilir (yetersiz ayrıcalıklar, vb.) Ve hata kullanıcıya bildirilir. başarısız olduklarını görmelerine izin verecek (ve neden bazı fikirleri vardır). Koddaki hatayı işlemek, uygulamanızın kurtarılmasına da izin verecektir. Örneğin, yapıştırdığınız kodun altındaki dosyayı (dosyaya yazdıktan sonra) okumayı denediyseniz, ancak kullanıcı erişemediği bir ağ paylaşımına yazmayı denediyse, uygulamanız çökebilir. Yazmanın başarısız olduğunu biliyorsanız, buna göre ilerleyebilirsiniz (belki de farklı bir kaydetme konumu için).

uygulama korumalı alan edilir
NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile]; 

, kullanıcı belirli bir dosya veya belirli bir biri için size izin vermesi gerekir: Bu durumda

olsa da, ben aşağıdaki satırı senin sorunun olduğuna inanıyoruz Açma/kaydetme panelleri aracılığıyla onları sandbox'ınıza getirmek için numaralı dizini açın. Yaptığınız şey, kullanıcının "bu harika, ama farklı bir dosyayı kaydetmek istiyorum" yazmasını ve söyleyebilmesini sağlayan dosyayı alıyor. Bunun yerine yapmanız gereken, uzantıyı Kaydetme Paneline ayarlıyor. komple sabit bir çözüm olacaktır: başka gelecek şeylerin yanlış olduğunu içinde
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]; 
} 

, çalışma zamanında error değerini kontrol edebilirsiniz edin. Hata ayıklama yaparken, error nesnesinin değerini kontrol etmek için if (error) ifadesinin içinde bir kesme noktası ayarlayın (Xcode'un hata ayıklayıcısında po error yapın). Bu neyin yanlış olduğunu anlamanıza yardımcı olmalı.

+0

Çok teşekkürler kardeşim! Bir çekicilik gibi çalıştı! Yardımlarınız için teşekkürler! Massy – Blue

+0

Sorun değil. Ayrıca bahsetmeyi de unutmam, özellikle de dosya I/O ile uğraşırken hataların üstesinden gelmek için iyi bir uygulama çünkü kodunuz% 100 doğru olduğunda bile, bir kullanıcının sisteminde sorunlar (yetersiz ayrıcalıklar, vb.) Olabilir. Bunu cevaba ekledim. – Dov

+0

İstenen kaydetme dosya adını, 'Untitled' belgesi olarak kaydetmeyecek şekilde de ayarlayabilirsiniz: [save setNameFieldStringValue: @ "MySuggestedFilename"] –