Перетаскивание с идентификатором пользовательского типа не работает - PullRequest
2 голосов
/ 15 апреля 2020

Я пытаюсь добиться перетаскивания в macOS с помощью пользовательского идентификатора типа, чтобы избежать коллизий, но, похоже, это не работает. Во-первых, вот рабочий пример с publi c и известным идентификатором:

struct ReleaseView: View {
    let id: Int

    var body: some View {
        GeometryReader { _ in
            VStack(spacing: 16) {
                Image(nsImage: NSImage(named: NSImage.networkName)!)
                    .contentShape(Rectangle())
                    .onDrag {
                        return NSItemProvider(item: "\(self.id)" as NSString, typeIdentifier: NSPasteboard.PasteboardType.string.rawValue)
                    }

                DropZone()
            }
        }
    }
}

struct DropZone: View {
    @State var isDragging = false

    var body: some View {
        RoundedRectangle(cornerRadius: 16)
            .stroke(style: StrokeStyle(lineWidth: 4, dash: [8, 8]))
            .background(isDragging ? Color.secondary : Color.clear)
            .frame(width: 100, height: 100)
            .onDrop(of: [NSPasteboard.PasteboardType.string.rawValue], isTargeted: self.$isDragging) { itemProvider in
                print(itemProvider)
                return true
            }
    }
}

В этом примере вы можете перетащить изображение выше в зону перетаскивания, и оно будет распечатано. провайдер. Теперь просто изменение typeIdentifier ломает все.

static let sharedTypeIdentifier = "com.procrastin8.plzwork"

struct ReleaseView: View {
    // skipping the unchanged bits

                    .onDrag {
                        return NSItemProvider(item: "\(self.id)" as NSString, typeIdentifier: sharedTypeIdentifier)
                    }
}

struct DropZone: View {
    // skipping the unchanged bits

           .onDrop(of: [sharedTypeIdentifier], isTargeted: self.$isDragging) { itemProvider in
                print(itemProvider)
                return true
            }
}

Теперь это не работает. Здесь используется одна и та же константа, так что это не совпадение строк. Просто еще одна ошибка SwiftUI?

1 Ответ

0 голосов
/ 15 апреля 2020

typeIdentifier выше не просто уникальная строка, это должно быть UTI .

Если вы хотите использовать c UTI для определенного пользовательского приложения (подумайте дважды, если он вам действительно нужен), вам нужно зарегистрировать его в соответствии с правилами Apple, начиная с

<key>UTExportedTypeDeclarations</key>
        <array>
            <dict>
                <key>UTTypeIdentifier</key>
                <string>com.procrastin8.plzwork</string>
                ...

в приложении Info.plist

Подробнее см. В Объявление новых идентификаторов унифицированных типов

И широкий набор в Технические вопросы и ответы QA1796

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...