fixing - Thread 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 21 ноября 2018

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

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 голосов
/ 21 ноября 2018

Проблема заключается в том, что если пользователь нажимает кнопку, чтобы очистить холст до того, как он что-либо рисует, то произойдет ошибка, поскольку path присваивается значение только в touchesMoved().

Возможно, вы захотите изменить

var path:UIBezierPath!

на

var path:UIBezierPath?

Хотя это может показаться утомительным, поскольку вам нужно добавлять вопросительные знаки везде, где вы пытаетесь получить доступ к методу илисвойство path, оно намного безопаснее, и код в вашем примере не будет аварийно завершать работу.

PS Проверьте этот ответ .Он предоставляет много информации об использовании опций.

...