2016-12-17 6 views
2

번들 디렉토리에 일부 .zip 파일과 함께 제공되는 macOS 응용 프로그램을 만들고 있습니다.NSSavePanel을 사용하여 번들에서 데스크톱으로 파일 저장/복사

사용자는 내 앱에서이 파일을 사용자 지정 디렉토리에 저장할 수 있어야합니다.

나는 NSSavePanel을 발견하고 올바른 방법입니다 생각 - 그게 내가 지금까지이 작업은 다음과 같습니다

@IBAction func buttonSaveFiles(_ sender: Any) { 

    let savePanel = NSSavePanel() 

    let bundleFile = Bundle.main.resourcePath!.appending("/MyCustom.zip") 

    let targetPath = NSHomeDirectory() 
    savePanel.directoryURL = URL(fileURLWithPath: targetPath.appending("/Desktop")) 
    // Is appeding 'Desktop' a good solution in terms of localisation? 

    savePanel.message = "My custom message." 
    savePanel.nameFieldStringValue = "MyFile" 
    savePanel.showsHiddenFiles = false 
    savePanel.showsTagField = false 
    savePanel.canCreateDirectories = true 
    savePanel.allowsOtherFileTypes = false 
    savePanel.isExtensionHidden = true 

    savePanel.beginSheetModal(for: self.view.window!, completionHandler: {_ in }) 

} 

나는 savePanelbundleFile '을 넘겨'하는 방법을 찾을 수 없습니다.

내 주요 질문 : 어떻게 응용 프로그램 번들의 파일을 사용자 지정 디렉토리에 저장/복사 할 수 있습니까?

추가 질문에 따라 달라집니다. NSSavePanel : 1) 기본적으로 현지화되어 있지 않습니다 (내 Xcode 체계는 독일어로 설정되어 있지만 패널은 영어로 표시됨). 직접 수정해야하나요? 2) 기본적으로 확장 된 패널을 제공 할 수있는 방법이 있습니까?

+0

번들 또는 NSBundle에 대한 검색을 실행하면 도움이됩니다. –

+0

@ElTomato bundleFile에 대한 경로를 찾기 위해 이미'Bundle'을 사용했습니다 (위의 코드 참조). 설명 된 문제로는 도움이되지 않습니다. – ixany

+0

아, 죄송합니다. 생각해 봅시다. 나는 당신과 함께 돌아올 것입니다. –

답변

3

기존 파일 URL을 얻으려면 Bundle.main.url을 사용하고 패널과 함께 도착 URL을 가져온 다음 파일을 복사해야합니다. 패널은 파일에 아무 것도하지 않고 URL 만 가져옵니다.

예 : 또한

// the panel is automatically displayed in the user's language if your project is localized 
let savePanel = NSSavePanel() 

let bundleFile = Bundle.main.url(forResource: "MyCustom", withExtension: "zip")! 

// this is a preferred method to get the desktop URL 
savePanel.directoryURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first! 

savePanel.message = "My custom message." 
savePanel.nameFieldStringValue = "MyFile" 
savePanel.showsHiddenFiles = false 
savePanel.showsTagField = false 
savePanel.canCreateDirectories = true 
savePanel.allowsOtherFileTypes = false 
savePanel.isExtensionHidden = true 

if let url = savePanel.url, savePanel.runModal() == NSFileHandlingPanelOKButton { 
    print("Now copying", bundleFile.path, "to", url.path) 
    // Do the actual copy: 
    do { 
     try FileManager().copyItem(at: bundleFile, to: url) 
    } catch { 
     print(error.localizedDescription) 
    } 
} else { 
    print("canceled") 
} 

는, 패널이 확장 여부되고 있습니다은 앱에서 강제 할 수없는, 사용자의 선택입니다.

+0

정말 고마워요! 훌륭한 솔루션, 잘 작동합니다. 'NSSavePanel'이 왜 번역/지역화되지 않았는지 알고 싶습니까? 모든 시스템 제공 UI 요소는 관련 언어로 자동 표시되어야한다고 생각했습니다. – ixany

+1

반갑습니다. * [프로젝트가 현지화되어있는 경우] 패널은 자동으로 사용자의 언어 *로 표시됩니다 (http://take.ms/x5P8a). 목록에서 새 언어를 추가하는 것으로 충분합니다. 원하지 않는 언어를 실제로 구현할 필요는 없지만, 패널에 언어가 필요하기 때문에 적어도이 목록에 언어를 추가해야합니다. – Moritz

+1

현지화 추가를위한 [Xcode 스크린 샷에 대한 적절한 링크] (https://monosnap.com/file/P6rGrVhQsGaquhVdlzMNDK0FUVXFq6.png). – Moritz