문제 설명
Swift Mac Os 응용 프로그램 ‑ NSSavePanel이 '백그라운드 전용' 응용 프로그램에서 올바르게 작동하지 않습니다. (Swift Mac Os Application ‑ NSSavePanel does not behave correctly with a 'background only' application)
저는 Application is background only
가 true
로 설정된 상태 표시줄(팝오버 포함)에서만 작동하는 신속한 Mac OS 앱을 개발 중입니다.
팝오버 내부에서 사용자는 버튼과 상호작용하여 이미지를 저장할 수 있습니다. 보다 구체적으로 다음 기능이 트리거됩니다.
@IBAction func saveImage(sender: NSButton) {
self.closePopover()
let dialog = NSSavePanel()
let date = Date()
let formattedDate = getFormattedDate(date: date, format: "yyyy‑MM‑dd")
let formattedTime = getFormattedDate(date: date, format: "HH.mm.ss")
dialog.level = .modalPanel
dialog.title = "Choose a destination"
dialog.nameFieldStringValue = "Screenshot \(formattedDate) at \(formattedTime)"
dialog.showsResizeIndicator = true
dialog.showsHiddenFiles = false
dialog.canCreateDirectories = true
dialog.allowedFileTypes = ["png"]
if (dialog.runModal() == .OK) {
// Pathname of the file
if let result = dialog.url {
self.screenshot!.savePNGRepresentationToURL(url: result)
}
} else {
// User clicked on "Cancel"
return
}
}
문제는 다음과 같습니다.
-
Application is background only
=true
: NSSavePanel과 상호 작용할 수 없습니다. (다른 이름으로 저장
을 변경할 수 없습니다. 필드) 그리고 그 상자 안에 글을 쓰면 텍스트는 내가 상호 작용했던 마지막 애플리케이션에 작성됩니다(포커스는 실제로 모달에 있지 않음). 애플리케이션은 백그라운드 전용
=false
: NSSavePanel은 완벽하게 작동하지만 도크에 아이콘을 표시하고 싶지 않기 때문에 좋은 솔루션이 아닙니다.
그래서 문제는 애플리케이션이 백그라운드 전용임
과 명확하게 연결되어 있지만 둘 다 가질 수 있는 방법을 찾지 못했습니다.
- 앱 아이콘이 독
- NSSavePanel과의 좋은 상호작용
- 도크에 앱 아이콘 없음
- NSSavePanel과의 원활한 상호 작용
- 도크에 앱 아이콘 없음
- NSSavePanel과의 원활한 상호 작용
참조 솔루션
방법 1:
I solved using the NSApplication.shared.setActivationPolicy
method like this:
@IBAction func saveImage(sender: NSButton) {
self.closePopover()
NSApplication.shared.setActivationPolicy(.regular)
let dialog = NSSavePanel()
let date = Date()
let formattedDate = getFormattedDate(date: date, format: "yyyy‑MM‑dd")
let formattedTime = getFormattedDate(date: date, format: "HH.mm.ss")
dialog.level = .modalPanel
dialog.title = "Choose a destination"
dialog.nameFieldStringValue = "Screenshot \(formattedDate) at \(formattedTime)"
dialog.showsResizeIndicator = true
dialog.showsHiddenFiles = false
dialog.canCreateDirectories = true
dialog.allowedFileTypes = ["png"]
if (dialog.runModal() == .OK) {
// Pathname of the file
if let result = dialog.url {
self.screenshot!.savePNGRepresentationToURL(url: result)
}
} else {
// User clicked on "Cancel"
}
NSApplication.shared.setActivationPolicy(.accessory)
}