2009-12-18 62 views
3

在導航服務世界中,您可以指定kNavDontConfirmReplacement作爲創建NavDialogRef的選項,該選項不會要求用戶在使用已存在的文件名進行保存時確認替換文件。我如何指定與Cocoa NSSavePanel等效的行爲?NSSavePanel:壓制「確認替換?」對話框

+0

你能解釋一下你爲什麼要這樣做嗎? – 2009-12-19 11:01:48

+0

我想用我自己的confirm-overwrite對話框替換它。 – fbrereto 2009-12-19 15:38:44

回答

4

下面是它如何可以做到:

  1. 添加一個委託來處理NSSavePanel回調
  2. 覆蓋- (NSString*)panel:(id)sender userEnteredFilename:(NSString*)filename confirmed:(BOOL)okFlag在您的代理
  3. 在委託:
    1. 如果okFlagfalse,回報filename
    2. 否則,保留filename作爲您的代理一個NSString*
    3. 返回一些獨特的字符串,它是極不可能是一個實際的文件名
  4. NSSavePanel回到你的代碼,從您的委託方法拉文件名的值,並丟棄無論文件名NSSavePanel告訴你(這應該是你唯一的字符串)。

由於userEnteredFilename:由OS稱爲確認替換檢查,纔給你一個機會,以獲取用戶指定的內容而不讓OS上的祕密。唯一的字符串將確保確認替換對話框不會意外彈出。

毛重但有效。

+0

請注意,文件名可能包含斜槓。保存面板的默認行爲似乎是將它們轉換爲冒號。 – George 2015-07-10 04:31:25

+0

這似乎違背了人機界面準則,不會打破用戶的期望。必須有一種方法來做到這一點是正確的(即不太嚴重)的方式。 非常漂亮的想法順便說一句 – 2016-07-29 23:32:03

0

不,沒有簡單的方法可以用NSSavePanel來做到這一點。從理論上講,你可以用一個類別來擴展NSSavePanel並覆蓋某些私有方法。儘管我看了一下,但沒有什麼簡單的。

+0

在這裏使用覆蓋做一些討論: http://www.cocoadev.com/index.pl?DisableAlertBoxInNSSavePanel – 2009-12-21 15:07:34

0

當您遇到NSSavePanel時,您的客戶將會期待確切的確認提示,所以請不要對其進行自定義。

我不確定你正在計劃什麼樣的自定義確認覆蓋對話框,但我可以建議你改用NSOpenPanel,並用「創建新文件」按鈕來定製這個對話框? (我相信你可以通過setAccessoryView API來做到這一點。)

例如,如果你要求你的客戶選擇一個文件來追加新數據,NSOpenPanel將工作得很好;如果客戶想要將新數據保存到新文件(而不是附加到現有文件),則「創建新文件」按鈕只是一個額外的點擊。