NSSavePanel: подавление "подтвердить замену?" диалог

В мире Nav Services можно указать kNavDontConfirmReplacement как вариант для создания NavDialogRef это не будет запрашивать у пользователя подтверждения замены файла при сохранении с именем файла, которое уже существует. Как мне указать эквивалентное поведение с Какао NSSavePanel?

3 ответа

Решение

Вот как это можно сделать:

  1. Добавить делегата для обработки обратных вызовов NSSavePanel
  2. Override - (NSString*)panel:(id)sender userEnteredFilename:(NSString*)filename confirmed:(BOOL)okFlag в вашем делегате
  3. В делегате:
    1. Если okFlag является false, вернуть filename
    2. В противном случае сохранить filename как NSString* в вашем делегате
    3. Вернуть некоторую уникальную строку, которая вряд ли будет именем реального файла
  4. когда NSSavePanel возвращается к вашему коду, извлекает значение имени файла из вашего метода делегата и отбрасывает любое имя файла NSSavePanel сказал вам (которая должна быть вашей уникальной строкой).

поскольку userEnteredFilename: вызывается операционной системой до того, как будет произведена проверка подтверждения-замены, она дает вам возможность получить то, что указал пользователь, не позволяя ОС вводить секрет. Уникальная строка гарантирует, что диалог подтверждения-замены не появится случайно.

Брутто, но эффективно.

Нет, нет простого способа сделать это с NSSavePanel. Теоретически вы можете расширить NSSavePanel категорией и переопределить некоторые частные методы. Я бросил быстрый взгляд, и в этом нет ничего простого.

Ваши клиенты будут ожидать точного уведомления о подтверждении, когда сталкиваются с NSSavePanel, поэтому не настраивайте его.

Я не уверен, какой вид настраиваемого диалогового окна подтверждения-перезаписи вы планируете, но могу ли я предложить вам вместо этого использовать NSOpenPanel и настроить это диалоговое окно с помощью кнопки "Создать новый файл"? (Я считаю, что вы можете сделать это через API setAccessoryView.)

Например, если вы просите своего клиента выбрать файл для добавления новых данных, NSOpenPanel будет работать достаточно хорошо; и если клиент хочет сохранить новые данные в новый файл (вместо добавления к существующему файлу), кнопка "Создать новый файл" - это просто дополнительный щелчок.

Другие вопросы по тегам