不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil

Posted

技术标签:

【中文标题】不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil【英文标题】:Not sure how to set my variables correctly for existing code. Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value 【发布时间】:2020-02-06 17:41:02 【问题描述】:

我目前正在尝试从 viewcontrollers viewdidload() 中的单独类运行一个函数。以前的开发人员团队编写了代码,我正在努力让它工作,因为我对 swift 也很陌生。

我没有包含所有函数,因为它很长,但我只是想知道是否可以得到一些建议,我收到错误“致命错误:意外发现 nil,同时隐式展开可选值”对于 shapelayer 值,我'我知道这是因为它们尚未初始化,但我正在努力弄清楚如何正确设置变量而不会弄乱整个代码,只是希望得到一些指导。

我确定我可能需要解释更多,但是代码很多,我整天都在盯着它,如果我需要更多上传,请告诉我。

class TraceViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 

  @IBOutlet weak var canvasView: CanvasView!
  static var curLetter = "A"

  override func viewDidLoad() 
    canvasView.letter = TraceViewController.curLetter
    canvasView.clearCanvas()
  

类:

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

  var initialPoint:CGPoint!

  var stroke1Done = false
  var stroke2Done = false
  var stroke3Done = false
  var stroke4Done = false
  var stroke5Done = false
  var stroke6Done = false
  var stroke7Done = false

 //Track current stroke and add all the shape layers into an array
  var currentStroke = 1
  var strokesArray = [CAShapeLayer]()

func drawShapeLayer() 
    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.cgPath //error here
    shapeLayer.strokeColor = lineColour.cgColor
    shapeLayer.lineWidth = lineWidth
    shapeLayer.fillColor = UIColor.clear.cgColor
    self.layer.addSublayer(shapeLayer)

    //Add the shapes in array so that we can track it
    self.strokesArray.append(shapeLayer)

    self.setNeedsLayout()


func clearCanvas() 
    guard path != nil else return
    path.removeAllPoints()
    self.layer.sublayers = nil
    self.setNeedsDisplay()
    print("Hello")
    stroke1Done = false
    stroke2Done = false
    stroke3Done = false
    stroke4Done = false
    stroke5Done = false
    stroke6Done = false
    stroke7Done = false

    goNext = false

    updateStrokePoints()

    updateStrokeDifference()

    currentStroke = 1
 

【问题讨论】:

您在哪一行收到致命错误? 您好,我刚刚评论了错误发生的位置。它发生在 shapeLayer.path 中,如果注释掉该变量,它会发生在每个 shapeLayer 属性中。 您声明了var path:UIBezierPath!,但您尚未创建它。 【参考方案1】:

该错误似乎是因为您在使用之前没有设置路径。您需要在实际调用之前设置path

第一:

var path: UIBezierPath?

然后:

path = UIBezierPath()

最后,使用它:

shapeLayer.path = path?.cgPath

另外,请记住使用? 而不是!,强制展开总是不好的做法。

【讨论】:

嘿,伙计,我已经尝试过了,并在每个变量的末尾添加了选项,当它们出现错误时,但我现在在我的代码中也充满了新的错误。我能联系你看一下我的代码吗,这门课很长。我整天都在努力让它运行:( 根据需要声明变量并非总是不好的做法(请注意,IBOutlets 是这样做的)。 @Slacky88,您需要做的是跟踪对 drawShapeLayer() 的调用,并在代码中查找 创建路径的位置,并找出为什么在该点之前调用 drawShapeLayer()

以上是关于不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

如何为我的应用正确设置最低 iOS 版本? [关闭]

如何为具有共享代码库的多个项目正确设置 git?

IIS 7 权限:如何为目录设置正确的权限?

如何为所有者绘制变量 CListBox (MFC) 设置高度

如何为代理网站正确配置 CORS 设置

如何为我的 Gatsby 网站创建第二个博客模板