非可选的IBOUTLET返回致命错误:从另一个UiviewController类引用时



我在

中定义了一个Uiview
class InteractViewController: UIViewController {
    @IBOutlet weak var tipsView: UIView!
        var tipslayer: CALayer {
        return tipsView.layer
    }
}

类别中还附有许多约束,例如标签。

@IBOutlet weak var tips1Top: NSLayoutConstraint!
@IBOutlet weak var tips1Right: NSLayoutConstraint!
@IBOutlet weak var tipsTitle: UILabel!
@IBOutlet weak var tipsDesc: UILabel!

所有这些都连接到了故事板上的正确插座。在实际的InteractViewController本身中引用这些内容,我可以调整不透明度,更新图层等。

但是,除非用户首先使用该应用程序,否则不需要这些,因此如果在InteractViewController上使用其他应用程序,请调用函数以显示和更新这些属性或根本不显示它们。

控制和更新这些属性的函数在另一个类中(项目中的Swift文件称为

class TipsViewController: UIViewController {
    func tips() {
        InteractViewController().tipslayer.transform = CATransform3DMakeScale(0.8, 0.8, 1.0)
    }
}

使该应用崩溃创建

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

on

return tipsView.layer (the InteractViewController)

tipsview和tipslayer是原因而不是选项,也不称为选项。

我有三个问题,希望我能得到帮助。

  1. 是否有对viewController类上插座的物理引用InteractViewController:uiviewController的问题?如果是这样,是因为应该通过编程方式添加它们,而是在类TipsViewController上:UiviewController(Xcode中没有物理视图控制器)?

  2. 确实对

    上的插座有物理引用

    类InteractViewController:uiviewController

如果在InteractViewController上在第二个ViewContoller tipsviewController.tips.tips()上呼叫,则创建不必要的内存使用,从来没有被调用。?

  1. 如果没有内存问题,并且知道TipsView和返回的TipsLayer不是选项,为什么我只是无法从其他类中的Tips()函数引用它们(TipsViewController:uiviewController)?我已经看到了有关"在视图控制器之间传递数据"的多个帖子,但我没有在变量或数组之间传递数据。我想/需要/只需更新标签字符串,约束(一个视图控制器类中的对象从另一个视图控制器类中。

我知道人们很忙,所以要提前说我感谢所有问题的反馈和帮助。

建议我的问题是[什么是致命错误:意外发现的,而在解开可选价值的同时"卑鄙?

这不是我的问题。我的问题专门涉及从另一个ViewController访问插座,然后从另一个ViewController中生成零响应,因为正如解释的InteractViewController所解释的那样,显然没有引用ViewController。请阅读Rob提供的解释和答案,该解释和答案回答了此特定问题。

您的标题说" iBoutlet返回致命错误:从另一个UiviewController类引用时"。最重要的是,一个视图控制器永远不应访问另一个视图控制器的插座。

在代码段中,您采用了InteractViewController()语法。不幸的是,这只是实例化视图控制器,但不会在故事板上连接插座。您需要通过情节板实例化,即使那样,您也无法立即引用插座,但是只有在viewDidLoad之后才稍后召集。无论如何,只有视图控制器本身才能尝试访问自己的插座。

TipsViewController()InteractViewController()语法说"创建一个新的,该视图控制器的空白实例"。这等同于说TipsViewController.init()InteractViewController.init()。而且,更糟糕的是,它根本没有使用故事板(因此不会连接插座)。那不是你想要的。您应该避免使用此ViewController()语法,因为插座永远无法以这种方式访问。


InteractViewController应该确定是否应显示 TipsViewController(例如检查用户默认值),如果是的,请介绍它。InteractViewController唯一要做的是:

  • 弄清楚是否提出TipsViewController;
  • 如果是这样,请介绍TipsViewController;和
  • 通过模型数据(例如,从UserDefaults检索到的任何InteractViewController)到为您创建的TipsViewController实例。

但是,关于TipsViewController如何呈现其子视图的所有内容,仅是TipsViewController的权限。InteractViewController切勿直接与TipsViewController的任何插座交互。

最新更新