【问题标题】:Why my scrollView is nil?为什么我的滚动视图为零?
【发布时间】:2016-07-20 07:19:53
【问题描述】:

使用第一个时滚动视图怎么可能为零:@IBAction afegeixGrafic 但使用 @IBAction func button 时它不是'? 我得到了 GraficsBalancGlobalViewController 类,它是 GraficViewController 类的子类

class GraficsBalancGlobalViewController: GraficViewController {
  @IBAction func afegeixGrafic(sender: NSButton) {
    addNewGrafic() // which is set on the GraficViewController
  }
}

当我执行IBActionafegeixGrafic 时,我的程序在下面标记的行崩溃:

class GraficViewController: NSViewController, GraficViewDataSource {
  @IBAction func button(sender: NSButton) {
    addNewGrafic()
  }

  func addNewGrafic() {
    let frame = NSRect(x: 0, y: 0, width: self.view.bounds.width , height: self.view.bounds.width * 0.25)
    let nouGrafic = GraficView(frame: frame)
    scrollView.addSubview(nouGrafic) <---- BREAK here!
  }

  @IBOutlet weak var scrollView: NSView!
  //...more code
}

编译器说:

致命错误:在展开可选值时意外发现 nil

GraficViewController 中的按钮 (IBAction) 效果很好!!所以我认为问题与scrollView有关,但我不知道可以是什么..它被初始化了..

我也试试这个:

@IBOutlet weak var scrollView: NSView? {
  didSet {
    guard let sview = scrollView else {
      addNewGrafic()
      return // because scrollView is nil for some reason, but don't work
    }
  }
}

完整代码:

class GraficsBalancGlobalViewController: GraficViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.
}

@IBAction func afegeixGrafic(sender: NSButton) {
    //performSegueWithIdentifier("Nou Grafic", sender: nil)
    //let viewController = storyboard!.instantiateControllerWithIdentifier(identifier!) as! GraficsBalancGlobalViewController
    addNewGrafic()

}

@IBAction func eliminaGrafic(sender: NSButton) {
}

}

【问题讨论】:

  • scrollView 在您的最后一个代码块中将始终为 nil - 这就是警卫正在检查的内容 - 只有当它为 nil 时才会进入 else
  • 是的,抱歉,这可能会造成混淆。不关心最后一个代码部分,重要的是第一个。
  • 向我们展示错误点的调用堆栈。
  • @LouFranco 使用IBAction button 时效果很好,但使用IBAction afegeixGrafic 会发生我要在我的问题上添加的事情!
  • 这里没有足够的信息来帮助您。它为 nil 的最可能原因是它被调用的时间——我们可以在调用堆栈中看到这一点。

标签: xcode swift view viewcontroller fatal-error


【解决方案1】:

它是 nil 因为你如何实例化 GraficsBalancGlobalViewController。您使用 xib 或情节提要进行设置,但是您在没有使用的情况下实例化了它。 这样做:

 let viewController = storyboard.instantiateControllerWithIdentifier(identifier) as GraficsBalancGlobalViewController

不是这个:

let viewController = GraficsBalancGlobalViewController()

【讨论】:

  • 我用过let viewController = GraficsBalancGlobalViewController()吗?我是新来的。我应该在哪里使用它:let viewController = storyboard.instantiateControllerWithIdentifier(identifier) as GraficsBalancGlobalViewController?你能解释一下它是如何工作的吗?
  • 无论什么类实例化 GraficsBalancGlobalViewController 都应该以这种方式创建。我假设在某个地方(上面没有提到)你有一条像 self.presentViewController(viewController, animated:true, completion:nil) 这样的行。我说的还不止这些。如果它被实例化并像这样推送: self.performSegueWithIdentifier("GraficsBalancGlobalViewControllerID", sender: nil) 并且您仍然得到一个 nil ,因为在您创建 IBOutlet 时出现了问题。在这种情况下,删除@IBOutlet weak var scrollView 并再次将其从界面构建器中拖过来。
  • 我觉得我的代码没有那么先进 :( ,你预料到了吗?(我在上面添加了代码),我还在学习如何做到这一点。
  • 用户如何访问 GraficsBalancGlobalViewController?它是应用程序加载时出现的第一个屏幕,还是他们必须在按下按钮或其他东西后到达它?
  • 它在一个 splitView 内,是管理半个屏幕的 2 个 ViewController 之一,它有 2 个按钮和一个包含 GraficViewController 的 contentView。我将发布一张新图片来展示这一点。
猜你喜欢
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多