Перетащите ячейки с помощью UILongPressGestureRecognizer в UITableView

Я работаю над приложением с tableView в ViewController. В этом табличном представлении у меня есть разделы и строки, и я хочу, чтобы мой пользователь мог долго нажимать, перетаскивать ячейки между разделами с помощью UILongPressGestureRecognizer.

С помощью следующего кода мой распознаватель жестов работает, но в тот момент, когда я пытаюсь перетащить ячейку в любую точку таблицы, мое приложение падает. Аварии происходят в двух разных строках. Когда ячейка долго нажата и перетаскивается внутри секции, она падает на этой строке: tableView.moveRowAtIndexPath(Path.initialIndexPath!, toIndexPath: indexPath!) если я пытаюсь вытащить из раздела, он падает на этой строке: swap(&Categories.categories[indexPath!.row], &Categories.categories[Path.initialIndexPath!.row])

(Массивы с данными для каждого раздела и строк находятся в отдельном классе с именем Categories. Массив с разделами называется "section", а массив со строками называется "category".)

Я был бы признателен за любую помощь в выяснении, почему это не удается и как я могу это исправить.

func setupLongPress() {
    let longpress = UILongPressGestureRecognizer(target: self, action:   "longPressGestureRecognized:")
    tableView.addGestureRecognizer(longpress)
}

func longPressGestureRecognized(gestureRecognizer: UIGestureRecognizer) {
    let longPress = gestureRecognizer as! UILongPressGestureRecognizer
    let state = longPress.state
    let locationInView = longPress.locationInView(tableView)
    let indexPath = tableView.indexPathForRowAtPoint(locationInView)

    struct My {
        static var cellSnapshot : UIView? = nil
    }
    struct Path {
        static var initialIndexPath : NSIndexPath? = nil
    }

    switch state {
    case UIGestureRecognizerState.Began:
        if indexPath != nil {
            Path.initialIndexPath = indexPath
            let cell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!
            My.cellSnapshot  = snapshopOfCell(cell)
            var center = cell.center
            My.cellSnapshot!.center = center
            My.cellSnapshot!.alpha = 0.0

            tableView.addSubview(My.cellSnapshot!)

            UIView.animateWithDuration(0.25, animations: { () -> Void in
                center.y = locationInView.y
                My.cellSnapshot!.center = center
                My.cellSnapshot!.transform = CGAffineTransformMakeScale(1.05, 1.05)
                My.cellSnapshot!.alpha = 0.98
                cell.alpha = 0.0
                }, completion: { (finished) -> Void in
                    if finished {
                        cell.hidden = true
                }
            })
        }

    case UIGestureRecognizerState.Changed:
        var center = My.cellSnapshot!.center
        center.y = locationInView.y
        My.cellSnapshot!.center = center
        if ((indexPath != nil) && (indexPath != Path.initialIndexPath)) {
            swap(&Categories.categories[indexPath!.row], &Categories.categories[Path.initialIndexPath!.row])
            tableView.moveRowAtIndexPath(Path.initialIndexPath!, toIndexPath: indexPath!)
            Path.initialIndexPath = indexPath
        }

    default:
        let cell = tableView.cellForRowAtIndexPath(Path.initialIndexPath!) as UITableViewCell!
        cell.hidden = false
        cell.alpha = 0.0
        UIView.animateWithDuration(0.5, animations: { () -> Void in
            My.cellSnapshot!.center = cell.center
            My.cellSnapshot!.transform = CGAffineTransformIdentity
            My.cellSnapshot!.alpha = 0.0
            cell.alpha = 1.0
            }, completion: { (finished) -> Void in
                if finished {
                    Path.initialIndexPath = nil
                    My.cellSnapshot!.removeFromSuperview()
                    My.cellSnapshot = nil
            }
        })
    }
}

func snapshopOfCell(inputView: UIView) -> UIView {
    UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, false, 0.0)
    inputView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext() as UIImage
    UIGraphicsEndImageContext()
    let cellSnapshot : UIView = UIImageView(image: image)
            cellSnapshot.layer.masksToBounds = false
            cellSnapshot.layer.cornerRadius = 0.0
            cellSnapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0)
            cellSnapshot.layer.shadowRadius = 1.0
            cellSnapshot.layer.shadowOpacity = 0.2
    return cellSnapshot
}

Спасибо!

0 ответов

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