обещание нефайлового документа перетаскивание
Я пытаюсь создать обещание файла для приложения URL на основе документа, которое будет записывать html-файл ".webloc", когда его спросят, не является ли текущий URL-адрес документа файлом, но делегат моего поставщика никогда не вызывается. Документы немного тонкие и устаревшие, поэтому я подозреваю, что я чего-то упускаю или запутался (у меня, кажется, есть компания re: pasteboard, переход на UTI и делегаты нового поставщика), поэтому я почерпнул из сеанса WWDC'16 на обещаниях файлов много раз, и попробуйте имитировать пример кода Поддержки обещаний перетаскивания через файлы; фрагменты ниже.
Мы начинаем с делегата окна, когда перетаскиваем значок документа для запуска обещания:
func window(_ window: NSWindow, shouldDragDocumentWith event: NSEvent, from dragImageLocation: NSPoint, with pasteboard: NSPasteboard) -> Bool {
if promiseURL.isFileURL { return true }
pasteboard.clearContents()
pasteboard.writeObjects([self.panel])
let dragImage = doc?.displayImage ?? NSImage.init(named: "webIcon")
window.drag(dragImage!.resize(w: 32, h: 32), at: dragImageLocation, offset: .zero, event: event, pasteboard: pasteboard, source: self.panel, slideBack: true)
return false
}
Таким образом, если текущий документ является файлом, мы разрешаем нормальную обработку, в противном случае мы записали на монтажный стол наше окно (NSPanel) - перетащите источник,
func draggingSession(_ session: NSDraggingSession, sourceOperationMaskFor context: NSDraggingContext) -> NSDragOperation {
return (context == .outsideApplication) ? [.copy] : []
}
func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
return heliumPanelController.performDragOperation(sender)
}
required convenience init(pasteboardPropertyList propertyList: Any, ofType type: NSPasteboard.PasteboardType) {
Swift.print("init type: \(type.rawValue)")
self.init()
}
func pasteboardPropertyList(forType type: NSPasteboard.PasteboardType) -> Any? {
Swift.print("prop type: \(type.rawValue)")
switch type {
case .promise:
return promiseURL.absoluteString as NSString
case .fileURL, .URL:
return NSKeyedArchiver.archivedData(withRootObject: promiseURL)
case .string:
return promiseURL.absoluteString
default:
Swift.print("unknown \(type)")
return nil
}
}
func writableTypes(for pasteboard: NSPasteboard) -> [NSPasteboard.PasteboardType] {
var types : [NSPasteboard.PasteboardType] = [.fileURL, .URL, .string]
types.append((promiseURL.isFileURL ? .files : .promise))
Swift.print("write-types \(types)")
return types
}
func writingOptions(forType type: NSPasteboard.PasteboardType, pasteboard: NSPasteboard) -> NSPasteboard.WritingOptions {
Swift.print("write-options type: \(type.rawValue)")
switch type {
default:
return .promised
}
}
и чей делегат является делегатом поставщика файлов и поддерживает NSPasteboardWriting:
В настоящее время я пытаюсь настроить объект, который придерживается NSFilePromiseProvider, поскольку вы не можете расширить окно из-за множественного наследования, но здесь я еще больше запутался и застрял.
Функциональность, которую я пытаюсь имитировать, - это, скажем, Safari или Chrome, где вы можете перетащить адресную строку в Finder, что создаст html-файл ".webloc".