有没有一种简单的方法可以在两个UITableViews之间拖放UITableViewCell?

时间:2010-03-26 19:18:53

标签: iphone cocoa-touch ipad

正如标题所说。在单个UITableView中重新排序是微不足道的,但iPad的屏幕足够大,可以同时显示多个UITableView。所以似乎应该有一种方法可以在两个UITableViews之间拖放UITableViewCell。有关最佳方法的任何想法吗?

1 个答案:

答案 0 :(得分:11)

我的解决方案是使用自定义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获取放置目的地的确切视图。

如果您希望在表格视图中正常进行其他UI操作,请确保在手势识别器中禁用cancelsTouchesInView