Передача данных путем перетаскивания 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, но, пожалуйста, дайте мне знать, если вам понадобится еще код / ​​информация.

0 ответов

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