UILongPressGestureRecognizer аварийно завершает работу в табличном представлении при перетаскивании в верхнюю часть представления - SWIFT

Я использую UILongPressGestureRecognizer для каждой ячейки в представлении таблицы с двумя заголовками разделов/разделов. Когда я делаю долгое нажатие на ячейку в моем первом разделе и перетаскиваю ее в верхнюю часть таблицы, мое приложение вылетает. (Я отключил longPressGestureRecognizer для второго раздела). Я получаю точку исключения в строке ниже,

переменная indexPath: NSIndexPath? = self.routeTableView.indexPathForRowAtPoint(местоположение)!

Я получаю эту ошибку в отладчике,

фатальная ошибка: неожиданно найдено nil при развертывании необязательного значения

мой код ниже,

func longPressGestureRecognized (жест: UILongPressGestureRecognizer) {

    var state: UIGestureRecognizerState = gesture.state

    var location:CGPoint = gesture.locationInView(self.routeTableView)
    var indexPath: NSIndexPath? = self.routeTableView.indexPathForRowAtPoint(location)!

    if indexPath == nil {
        return
    }

    if indexPath?.section != 1 {

            switch(state){
            case UIGestureRecognizerState.Began:
                sourceIndexPath = indexPath

                var cell: UITableViewCell = self.routeTableView .cellForRowAtIndexPath(indexPath!)! as! RouteSelectionCell

                //take a snapshot of the selected row using helper method
                snapshot = customSnapshotFromView(cell)

                //add snapshot as subview, centered at cell's center
                var center: CGPoint = cell.center
                snapshot?.center = center
                snapshot?.alpha  = 0.0
                self.routeTableView.addSubview(snapshot!)
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    center.y = location.y
                    self.snapshot?.center = center
                    self.snapshot?.transform = CGAffineTransformMakeScale(1.05, 1.05)
                    self.snapshot?.alpha = 0.98
                    cell.alpha = 0.0
                    }, completion: { (finished) in
                        cell.hidden = true
                })

            case UIGestureRecognizerState.Changed:
                var center: CGPoint = snapshot!.center
                center.y = location.y
                snapshot?.center = center


                //is destination valid and is it different form source?
                if indexPath != sourceIndexPath{
                    //update data source
                    self.messageOptions.exchangeObjectAtIndex(indexPath!.row, withObjectAtIndex: sourceIndexPath!.row)
                    //move the row
                    self.routeTableView.moveRowAtIndexPath(sourceIndexPath!, toIndexPath: indexPath!)
                    //and update source so it is in sync with UI changes
                    sourceIndexPath = indexPath
                }

            default:
                //clean up
                let cell: UITableViewCell = routeTableView.cellForRowAtIndexPath(sourceIndexPath!)!
                cell.alpha = 0.0
                cell.hidden = false

                UIView.animateWithDuration(0.25, animations: { () -> Void in

                    self.snapshot?.center = cell.center
                    self.snapshot?.transform = CGAffineTransformIdentity
                    self.snapshot?.alpha = 0.0
                    //undo fade out
                    cell.alpha = 1.0

                    }, completion: { (finished) in
                        self.sourceIndexPath = nil
                        self.snapshot?.removeFromSuperview()
                        self.snapshot = nil
                })
                break
            }
        }
   }

У кого-нибудь есть предложения, как избежать этой проблемы?


person Jaxs_ios    schedule 21.07.2015    source источник


Ответы (1)


Когда вы вызываете self.routeTableView.indexPathForRowAtPoint(location)!, вы принудительно разворачиваете возвращаемое значение, и в этом случае оно равно нулю. Вот ты и разбиваешься.

Ваш код должен делать что-то вроде этого:

if let indexPath = self.routeTableView.indexPathForRowAtPoint(location) {
  //do normal code
} else {
  //the point didn't map back to a cell! Maybe it was on the header or footer? 
  //Handle this case differently.
}

Кроме того, я нашел этот ответ, который может помочь:

indexPathForRowAtPoint возвращает nil только для первой ячейки в uitableview

person 72A12F4E    schedule 21.07.2015
comment
Ааа. Поэтому я удалил ! и больше не разбиваюсь. Однако моя ячейка/моментальный снимок отключается, когда я перетаскиваю ее в верхнюю часть представления. Кажется, что он парит над другими ячейками. - person Jaxs_ios; 21.07.2015
comment
В операторе else вам нужно будет управлять тем, как поступать с этими конкретными пограничными случаями. Например, если он окажется в верхней части экрана, возможно, вставьте его в индекс 0. Если он внизу, вставьте его в конец таблицы. - person 72A12F4E; 21.07.2015
comment
вы говорите о snapshot.layer.edgeAntialiasingMask? Прости. Я занимаюсь разработкой чуть больше года. - person Jaxs_ios; 21.07.2015