NSSavePannel - как ограничить пользователя только одним каталогом? - PullRequest
0 голосов
/ 25 октября 2019

Пользователь должен сохранить файл, но я хочу, чтобы он сохранял файл только в одной папке. Как это сделать?

Я уже пытался реализовать делегата и принудительно установить обратно каталог, если он отличается. Это не работает. Пользователь по-прежнему может выбирать другие папки, когда открывается панель сохранения

extension Project:  NSOpenSavePanelDelegate  {
    func panel(_ sender: Any, didChangeToDirectoryURL url: URL?) {
        if url != testsFolder {
            (sender as! NSSavePanel).directoryURL = testsFolder
        }
    }

    func panel(_ sender: Any, validate url: URL) throws {
        if url.deletingLastPathComponent() != testsFolder {
            (sender as! NSSavePanel).directoryURL = testsFolder
            throw ProjectError.scriptInitiliation
        }
    }
}

1 Ответ

0 голосов
/ 25 октября 2019

Дело в том, что папка уже исправлена ​​в приложении.

Это время, когда пользователь получает разрешение на доступ к этой папке. Используйте открытое (не сохраняемое) диалоговое окно, чтобы пользователь подтвердил выбор папки. Думайте об этом как о «диалоге подтверждения доступа», вы можете:

  • Изменить метку кнопки «Открыть» на что-то другое, используя prompt
  • Установить titleи message, поэтому диалоговое окно является диалоговым окном подтверждения
  • установите исходную папку, указав directoryURL в качестве родительского для того, который вы хотите подтвердить (Примечание: любые изменения в directoryURL после диалоговое окно закрыто и игнорируется, поэтому вы не можете заблокировать диалоговое окно для этой папки с помощью делегата didChangeToDirectoryURL - в ранней песочнице вы могли, но Apple сейчас это остановила)
  • Установите delegate и используйте егоshouldEnable и validate обратные вызовы, чтобы убедиться, что только папка, которую вы хотите подтвердить, может быть выбрана или диалоговое окно отменено.
  • Установите canCreateDirectories & canChooseFiles на false, canChooseDirectories наtrue

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

С этого момента, чтобы ограничить пользователей сохранением в этой папке, откройте собственный диалог, чтобы запроситьпросто имя файла, пропуская часть пути и обход NSSavePanel - вы можете выдавать себя за стандартные диалоги или создавать свои собственные с нуля.

HTH

...