Есть ли простой способ перетащить UITableViewCell между двумя UITableViews?

Как говорится в названии. Переупорядочение в одном UITableView тривиально, но экран iPad достаточно велик, чтобы одновременно отображать несколько UITableView. Таким образом, кажется, что должен быть способ перетащить UITableViewCell между двумя UITableView. Любые мысли о наилучшем подходе?

Ответ 1

Мое решение состояло в использовании пользовательского UIGestureRecognizer для отслеживания событий касания и отдельного представления для рисования операции перетаскивания.

Это работает, потому что UIGestureRecognizer не блокирует цепочку ответчиков. Из документации UIGestureRecognizer:

Объекты UIGestureRecognizer не входят в цепочку респондеров, но при этом наблюдают, как попадаются удары с их просмотром и их представлениями.

Создайте собственный UIViewController (DragAndDropViewController) и добавьте его представление в родительский вид представлений, для которых требуется операция перетаскивания. Используйте свой собственный класс распознавания жестов для пересылки сенсорной информации на ваш DragAndDropViewController.

Источник сообщает вашему DragAndDropViewController, откуда происходит перетаскивание (и любая пользовательская информация). Контроллер должен также иметь ссылку делегата на пункт назначения пересылки. Когда произойдет сбой, отправьте делегату событие UITouch (не рекомендуется в соответствии с Apple, но объект UITouch необходим, чтобы получить правильное местоположение в представлении назначения).

Вот как выглядит мой DragAndDropViewController:

@protocol DragAndDropDestination

(void)droppedItem:(NSDictionary *)item withTouch:(UITouch *)touch;

@end

@interface DragAndDropViewController : UIViewController { id _dropDestination; NSDictionary *_draggedItem; UIImageView *_icon; }

@property (nonatomic, assign) id dropDestination; @property (nonatomic, retain) NSDictionary *draggedItem;

// Source sends this message - (void)startDraggingWithItem:(NSDictionary *)item;

@end

Как только получатель получит сообщение, вы можете использовать - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event, чтобы получить точное представление в пункте назначения.

Также убедитесь, что вы отключили cancelsTouchesInView в распознавателе жестов, если вы хотите, чтобы другие операции пользовательского интерфейса обычно происходили в ваших представлениях таблицы.