обещание нефайлового документа перетаскивание

Я пытаюсь создать обещание файла для приложения 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".

0 ответов

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