Передача данных путем перетаскивания UITableViewCell в UIView с использованием инфраструктуры UIDragInteraction
Обзор: у меня есть табличное представление, в котором отображается список клиентов из моей модели (массив EntityLite), и я хочу иметь возможность перетаскивать их в календарь, чтобы создать новую встречу для этого клиента.
У меня есть два контроллера представления, один из которых содержит UITableView, а другой - календарь (WeekCalendarView), который является подклассом UIView. Я пытаюсь использовать UIDragInteraction для передачи EntityLite в indexPath ячейки представления таблицы (расположенной в контроллере представления, содержащем UITableView) в WeekCalendarView при перетаскивании из UITableViewCell в WeekCalendarView.
Кажется, что структура UIDragInteraction позволяет передавать только данные, соответствующие _ObjectiveCBridgeable, например UIImage (как указано в примере, предоставленном Apple здесь .
Я пробовал создать подкласс UIImage (ActivityImage) и передать дополнительный параметр (EntityLite) в качестве обходного пути, чтобы увидеть, работает ли это, но безрезультатно. Однако, если я заменю все экземпляры ActivityImage на UIImage, он будет работать нормально.
Вот мой собственный класс ActivityImage:
class ActivityImage: UIImage {
var entityLite: EntityLite! = nil
convenience init?(entityLite: EntityLite) {
guard let image = UIImage(named: "arrow.down"), nil != image.cgImage else {
return nil
}
self.init(cgImage: image.cgImage!)
self.entityLite = entityLite
}
}
Вот метод делегата DragInteraction из UITableViewController:
func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
if let cell = interaction.view as? UITableViewCell {
let entityLite = searchedEntityLites[tableView.indexPath(for: cell)!.row]
let activityImage = ActivityImage(entityLite: entityLite)
let stringItemProvider = NSItemProvider(object: activityImage!)
return [UIDragItem(itemProvider: stringItemProvider)]
}
let stringItemProvider = NSItemProvider(object: "Hello World" as NSString)
return [UIDragItem(itemProvider: stringItemProvider)]
}
Вот метод делегата DropInteraction внутри ViewController, содержащий подкласс UIView:
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
session.loadObjects(ofClass: ActivityImage.self) { imageItems in
let images = imageItems as! [ActivityImage]
print(images.first) // Returns nil
}
}
Используя приведенный выше код, когда я начинаю перетаскивать UITableViewCell, создаются и activityImage, и dragItem, но когда я отпускаю элемент в UIView, первый элемент из «изображений» равен нулю.
Однако, как упоминалось ранее, если я заменю все экземпляры ActivityImage в приведенном выше коде на UIImage в методах делегата, первый элемент из «изображений» будет UIImage, поэтому все работает нормально.
Я понимаю, что это определенно неправильный способ сделать это, но я хотел проверить, смогу ли я передать дополнительную информацию через подкласс UIImage. Я чувствую, что должен быть более простой и менее хитрый способ сделать это с помощью инфраструктуры DragInteraction, так что, возможно, я что-то упускаю.
Кроме того, извиняюсь, я относительно новичок в Swift, но, пожалуйста, дайте мне знать, если вам понадобится еще код / информация.