拖到视图顶部时,UILongPressGestureRecognizer 在表格视图中崩溃 - SWIFT
UILongPressGestureRecognizer crashes in tableview when dragged to top of view - SWIFT
我正在为具有两个 sections/section headers 的 table 视图中的每个单元格使用 UILongPressGestureRecognizer。当我长按第一部分中的单元格并拖动到 table 视图的顶部时,我的应用程序崩溃了。 (我已经为第二部分禁用了 longPressGestureRecognizer)。我在下面的行中得到一个异常点,
var 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
}
}
}
有人对如何避免这个问题有任何建议吗?
当您调用 self.routeTableView.indexPathForRowAtPoint(location)!
时,您将强制解包返回的值,在本例中为 nil。这就是你崩溃的地方。
您的代码应执行如下操作:
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 returns nil only for first cell in a uitableview
我正在为具有两个 sections/section headers 的 table 视图中的每个单元格使用 UILongPressGestureRecognizer。当我长按第一部分中的单元格并拖动到 table 视图的顶部时,我的应用程序崩溃了。 (我已经为第二部分禁用了 longPressGestureRecognizer)。我在下面的行中得到一个异常点,
var 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
}
}
}
有人对如何避免这个问题有任何建议吗?
当您调用 self.routeTableView.indexPathForRowAtPoint(location)!
时,您将强制解包返回的值,在本例中为 nil。这就是你崩溃的地方。
您的代码应执行如下操作:
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 returns nil only for first cell in a uitableview