我正在尝试将一个项目从一个UITableView复制到另一个View,并且在过去的两天里我一直在努力工作,但我仍然不知道该如何完成。

这是我的UI架构的小草图

ios - 从TableView拖放到Swift中的另一个 View-LMLPHP

这是我在做什么

  • 长按表格 View 中的一行
  • 长按
  • 时,在单元格中创建图像的快照
  • 将快照拖动到表 View
  • 之外的View(绿色区域)
  • 发布后,请检查快照是否已在“绿色 View ”区域中删除。

  • 我可以一直执行到创建快照为止,并且当我尝试拖动快照时,无法获得将快照拖动到的点。释放拖动后,我需要检查拖动的最后一点是否在DROP AREA(绿色)内。

    任何人都可以通过一些示例代码来提供一些有关如何解决问题的见解...

    提前致谢...

    最佳答案

    目前,我没有时间测试代码,但是应该足够有意义....您可以执行以下操作:

    class ViewController: UIViewController, UITableViewDataSource {
    
        private var dragView: UIView?
        @IBOutlet weak var dropZone: UIView!
    
        func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 1
        }
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 3
        }
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    
            let lpGestureRecognizer: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(didLongPressCell))
            cell.contentView.addGestureRecognizer(lpGestureRecognizer)
    
            return cell
        }
    
        func didLongPressCell (recognizer: UILongPressGestureRecognizer) {
            switch recognizer.state {
            case .Began:
                if let cellView: UIView = recognizer.view {
                    cellView.frame.origin = CGPointZero
                    dragView = cellView
                    view.addSubview(dragView!)
                }
            case .Changed:
                dragView?.center = recognizer.locationInView(view)
            case .Ended:
                if (dragView == nil) {return}
    
                if (CGRectIntersectsRect(dragView!.frame, dropZone.frame)) {
                    if let cellView: UIView = (dragView?.subviews[0])! as UIView {
                        cellView.frame.origin = CGPointZero
                        dropZone.addSubview(cellView)
                    }
    
                    dragView?.removeFromSuperview()
                    dragView = nil
    
                    //Delete row from UITableView if needed...
                } else {
                    //DragView was not dropped in dropszone... Rewind animation...
                }
            default:
                print("Any other action?")
            }
        }
    
    }
    

    更新评论:

    当然,一种可能是标记字段...像这样:
    private let imageViewTag: Int = 997
    private let textLabelTag: Int = 998
    private let detailTtextLabelTag: Int = 999
    
    //...
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        //...
        cell.imageView?.tag = imageViewTag
        cell.textLabel?.tag = textLabelTag
        cell.detailTextLabel?.tag = detailTtextLabelTag
        //...
    
    }
    
    func didLongPressCell (recognizer: UILongPressGestureRecognizer) {
        //...
        case .Ended:
        let cellImageView: UIImageView? = recognizer.view?.viewWithTag(imageViewTag) as? UIImageView
        let cellTextLabel: UITextField? = recognizer.view?.viewWithTag(textLabelTag) as? UITextField
        let cellDetailTextLabel: UITextField? = recognizer.view?.viewWithTag(detailTtextLabelTag) as? UITextField
        //...
    }
    

    07-24 09:45
    查看更多