2015-06-26 39 views
0

在其文檔中,我的應用程序使用了很多與文檔路徑相關的資產。因此,在添加資產之前必須保存該文檔。我如何強制調用[NSDocument saveDocumentAs]?強制NSDocument在創建後保存

我設法做它的部分:通過創建自己的文件控制器和內部openUntitledDocumentAndDisplay:強制這樣一個電話:

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError 
{ 
    NSDocument * res = [super openUntitledDocumentAndDisplay:displayDocument error:outError]; 
    [res saveDocumentAs:self]; 


    return res; 
} 

這迫使保存對話框出現,但不幸的是我無法檢查用戶是否按下取消:saveDocumentAs調用是異步的,並立即繼續!

有沒有辦法解決這個問題?

回答

0

我在我的應用程序中有一個類似的東西,在我的情況下,如果用戶試圖做某件事情,我會提示說'這需要您先保存文件',並用按鈕取消或保存。

如果你想絕對強制它,那麼不要使用saveDocumentAs,只要顯示你自己的NSSavePanel。以模態方式運行,檢查結果,將結果保存在文檔中,如果不能順利進行,請再次調用它。您可以通過查找文件路徑的有效值來檢查文檔是否已保存。

+0

這只是我不是所有與可可框架經歷和NSSavePanel看起來相當艱鉅。但我想我確實沒有別的選擇。謝謝(你的)信息 ! – cocoabeginner

+0

我懂了! 但調用[saveToURL:url]後,「Save ...」菜單項保持暗淡!即使在修改文檔後,我也無法保存:-(打開文檔(爲空)將允許我再次保存。只有剛創建的文檔無法保存:-( – cocoabeginner

+0

call updateChangeCount:正確表明有東西要保存,更好的是實現撤消操作。 –

0

我有一個類似的問題。通過使用: saveDocumentWithDelegate:(id)委託didSaveSelector:(SEL)didSaveSelector contextInfo:(void *)contextInfo 您可以推遲處理(或不),直到文檔保存對話完成後。這意味着你可以找出用戶是否取消。你將處理分成兩部分,做任何你需要的準備工作,然後把剩下的部分(取決於成功的保存)轉換成另一種方法。如果您使用的是這樣的:

[self saveDocumentWithDelegate:self didSaveSelector:@selector(actuallyDoIt: didSave: contextInfo:) contextInfo:nil]; 

該文件將被保存,但是,關鍵的是,如果以前沒有保存,保存對話框將會出現,使用戶可以輸入一個文件名。一旦他/她已經完成了,或者取消了,你的方法實際上就是:(或者其他)被調用。 didSave:參數告訴你實際保存是否發生(實質上,用戶是否取消),以便您可以繼續或提供警報,禮貌地向用戶解釋在保存之前不會發生任何事情。

0

NSSavePanel可以模態運行。這是它的樣子/樣子。

  • 覆蓋openUntitledDocumentAndDisplay

    • (NSData的*) - 在廈門國際銀行(>應用程序沒有完成啓動無XIB)

      1. 創建自定義nsdocumentsubclass:

        - (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError *__autoreleasing *)outError 
        { 
            Document *document; 
            NSSavePanel *panel = [NSSavePanel savePanel]; 
            panel.prompt = @"Create"; 
            NSInteger modalCode = [panel runModal]; 
            if (modalCode == NSModalResponseOK) { 
            NSURL *URL = [panel URL]; 
            NSError *docError; 
            document = [[Document alloc] initWithType:nil & docError]; 
            [document saveToURL:URL ofType:nil forSaveOperation:NSSaveOperation completionHandler:^(NSError *error){ 
             if(error) { 
             return nil; 
             } 
             [self addDocument:document]; 
             [document makeWindowControllers]; 
             if (displayDocument) { 
             [document showWindows]; 
             } 
            }]; 
            } 
        
            return document; 
        } 
        

        綜上所述參考dataOfType:(NSString *)typeName錯誤:(NSError **)outError;

  • 相關問題