我想运行一个涉及向集合视图添加子图层的函数。但是,当我运行该函数时,应用程序崩溃说Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
当我打印集合视图时,它在日志中显示为none
所以我知道集合视图是问题。当我调用该函数时,该视图已被加载,我可以看到它的所有单元格。该函数是从另一个类调用的,我认为这可能与该问题有关。
这是我打电话的功能......
func displayCircle() {
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
//change the fill color
shapeLayer.fillColor = UIColor.green.cgColor
//you can change the stroke color
shapeLayer.strokeColor = UIColor.green.cgColor
//you can change the line width
shapeLayer.lineWidth = 3.0
print(shapeLayer)
print(collectionView)
collectionView!.layer.addSublayer(shapeLayer)
}
以下是我从另一个类调用此函数的方法......
ViewController().displayCircle()
编辑:这是我的故事板布局......
问题是什么?
如您所见,我正在使用页面视图控制器。希望这有帮助
答案 0 :(得分:2)
这里可能有一些问题。
如果您想说ViewController.displayCircle()
,则displayCircle
需要是静态函数。但我不认为这是你的意图,在这种情况下你可能不想这样做,而且你的静态函数语法也是错误的(ViewController().displayCircle()
是错误的)。但继续......:)
ViewController().displayCircle()
并不是您正确引用collectionView的方式。首先,您需要引用另一个视图控制器。然后在displayCircle
内,您需要获取collectionView
的引用,如果它在另一个视图控制器中。如果otherViewController.collectionView
当然是公开的,那么这将是collectionView
,并且如果您以某种方式引用了其他视图控制器。请注意,您不能仅对其他视图控制器进行新引用,否则您将调整新实例上的图层,而不是原始图层。
最后但并非最不重要的是,你强行展开collectionView
- 不要这样做。如果它的应用程序永无止境,您的应用程序将会崩溃。相反,利用Swift的范例:
if let collView = collectionView {
collView.layer...// etc
}
最后一点不是问题,只是好的做法。
答案 1 :(得分:1)
如果collectionView是同一个viewController的一部分,请使用self:
self.collectionView.layer.addSublayer(shapeLayer)
如果collectionView位于不同的viewController中,您可能需要获取对该视图控制器的引用。如何执行此操作取决于您的应用程序的结构。您提到使用UIPageViewController
,并且可能两个视图控制器都显示在其上。
从一个视图控制器,您可以像这样引用另一个:
let pvc = self.parent as? UIPageViewController // Or your custom class
let targetViewController = pvc.viewControllers[index] as? YourTargetViewControllerClass
您可能需要弄清楚您需要的index
。另一种方法是确保UIPageViewController
的每个子视图控制器都有自己的子类,然后找到你想要的那个:
let pvc = self.parent as? UIPageViewController
let viewControllers = pvc.viewControllers.filter { $0 is CustomSubclass }
if let viewController = viewControllers.first as? CustomSubclass {
viewController.displayCircle()
}
正如其他答案所述,使用ViewController()
创建一个全新的视图控制器实例,而不是已存在的实例。
答案 2 :(得分:0)
这个
ADMIN
创建一个除了呈现的实例之外的新实例,当你从它引用collectionView时它实际上是nil,因为你必须从storyboard / xib加载VC,所以你必须使用delegate来引用包含它的当前VC的CollectionView