Как использовать NSDraggingInfo.EnumerateDraggingItems от Xamarin? - PullRequest
1 голос
/ 13 января 2020

Я реализую NSTableView перетаскивания строк. Я работаю с приведенными здесь примерами Перетаскивание строк перестановки в NSTableView .

На самом деле все идет хорошо, так как методы источника данных вызываются, когда я перетаскиваю строку в моей таблице. Однако у меня возникли проблемы с использованием метода NSDraggingInfo.EnumerateDraggingItems из Xamarin.

Пример кода Swift:

info.enumerateDraggingItemsWithOptions([], forView: tableView, classes: [NSPasteboardItem.self], searchOptions: [:]) {
    if let str = ($0.0.item as! NSPasteboardItem).stringForType("public.data"), index = Int(str) {
        oldIndexes.append(index)
    }
}

Бит, с которым у меня возникли проблемы: classes: [NSPasteboardItem.self].

Сигнатуры метода Xamarin:

EnumerateDraggingItems(NSDraggingItemEnumerationOptions, NSView, NSPasteboardReading[], NSDictionary, NSDraggingEnumerator)
EnumerateDraggingItems(NSDraggingItemEnumerationOptions, NSView, NSArray, NSDictionary, NSDraggingEnumerator)
EnumerateDraggingItems(NSDraggingItemEnumerationOptions, NSView, IntPtr, NSDictionary, NSDraggingEnumerator)

Как указать обязательный аргумент для параметра classes?

1 Ответ

0 голосов
/ 02 февраля 2020

Кажется, что версия xamarin неверна (глядя на источник на github https://github.com/xamarin/xamarin-macios/blob/master/src/AppKit/NSDraggingSession.cs):

EnumerateDraggingItems(NSDraggingItemEnumerationOptions, NSView, NSPasteboardReading[], NSDictionary, NSDraggingEnumerator)

Поскольку параметр classes должен быть массивом определений классов не экземпляры. Используя эту версию

EnumerateDraggingItems(NSDraggingItemEnumerationOptions, NSView, NSArray, NSDictionary, NSDraggingEnumerator)

Массив классов может быть создан следующим образом:

var classesArray = NSArray.FromIntPtrs(new IntPtr[] {
    ObjCRuntime.Class.GetHandle(typeof(NSPasteboardItem))
});

Не проверял это.

...