我在
中定义了一个Uiviewclass 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是原因而不是选项,也不称为选项。
我有三个问题,希望我能得到帮助。
是否有对viewController类上插座的物理引用InteractViewController:uiviewController的问题?如果是这样,是因为应该通过编程方式添加它们,而是在类TipsViewController上:UiviewController(Xcode中没有物理视图控制器)?
确实对
上的插座有物理引用类InteractViewController:uiviewController
如果在InteractViewController上在第二个ViewContoller tipsviewController.tips.tips()上呼叫,则创建不必要的内存使用,从来没有被调用。?
- 如果没有内存问题,并且知道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
的任何插座交互。