修复-线程1:致命错误:展开一个可选值时意外发现nil

时间:2018-11-21 00:51:01

标签: swift xcode10 forced-unwrapping

我不熟悉编码,一直在尝试在屏幕上划出一个可以用手指签名的区域。我已经做了盒子,但我正在努力清理它。我已经将一个按钮连接到一个函数以清除路径,但是我似乎无法弄清楚如何安全地解开信息而不会崩溃。

import UIKit

class canvasView: UIView {

    var lineColour:UIColor!
    var lineWidth:CGFloat!
    var path:UIBezierPath!
    var touchPoint:CGPoint!
    var startingPoint:CGPoint!


    override func layoutSubviews() {
        self.clipsToBounds = true
        self.isMultipleTouchEnabled = false

        lineColour = UIColor.white
        lineWidth = 10
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        startingPoint = (touch?.location(in: self))!
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        touchPoint = touch?.location(in: self)

        path = UIBezierPath()
        path.move(to: startingPoint)
        path.addLine(to: touchPoint)
        startingPoint = touchPoint

        drawShapelayer()
    }
    func drawShapelayer(){
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        shapeLayer.strokeColor = lineColour.cgColor
        shapeLayer.lineWidth = lineWidth
        shapeLayer.fillColor = UIColor.clear.cgColor
        self.layer.addSublayer(shapeLayer)
        self.setNeedsDisplay()
    }

    func clearCanvas() {
        path.removeAllPoints()
        self.layer.sublayers = nil
        self.setNeedsDisplay()
    }

然后我在

之后的最终函数中得到错误
path.removeAllPoints()

如何最好将其拆开以防止其崩溃?

感谢您的耐心

1 个答案:

答案 0 :(得分:0)

问题在于,如果用户单击之前清除画布,则他/她将绘制任何东西,则将发生错误,因为path仅在{ {1}}。

您可能想要更改

touchesMoved()

var path:UIBezierPath!

尽管这看起来很乏味,因为您必须在尝试访问var path:UIBezierPath? 的方法或属性的任何地方添加问号,但这样做更加安全,并且示例中的代码不会崩溃。

P.S。签出this answer。它提供了有关使用可选选项的大量信息。