Ios 在函数中调用时,集合视图返回nil
我想运行一个函数,该函数涉及将子层添加到集合视图。但是,当我运行该函数时,应用程序崩溃,说Ios 在函数中调用时,集合视图返回nil,ios,swift,uicollectionview,swift4,Ios,Swift,Uicollectionview,Swift4,我想运行一个函数,该函数涉及将子层添加到集合视图。但是,当我运行该函数时,应用程序崩溃,说thread1:致命错误:在展开可选值时意外发现nil当我打印集合视图时,它在日志中显示为none,因此我知道集合视图是问题所在。当我调用函数时,视图已经加载,我可以看到它的所有单元格。该函数是从另一个类调用的,我认为这可能与问题有关 这是我正在调用的函数 func displayCircle() { let shapeLayer = CAShapeLayer() shap
thread1:致命错误:在展开可选值时意外发现nil
当我打印集合视图时,它在日志中显示为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()
编辑:这是我的故事板布局
有什么问题吗
如您所见,我使用的是页面视图控制器。希望这对你有所帮助
ViewController()
创建一个新实例,而不是当前实例,当您从中引用collectionView时,它实际上为零,因为您必须从storyboard/xib加载VC,因此您必须使用委托引用包含collectionView的当前VC
ViewController()
创建一个新实例而不是当前实例,当您引用collectionView时,它实际上为零,因为您必须从storyboard/xib加载VC,因此您必须使用委托来引用包含collectionView的当前VC这里可能有一些问题 如果您想说
ViewController.displayCircle()
,那么displayCircle
需要是一个静态函数。但我不认为这是您的意图,在这种情况下您可能不想这样做,而且您的静态函数语法也是错误的(ViewController().displayCircle()
是错误的)。但接下来……:)
ViewController().displayCircle()
不是正确引用collectionView的方式。首先,需要对另一个视图控制器的引用。然后在displayCircle
中,如果它位于另一个视图控制器中,则需要获取对collectionView
的引用。如果collectionView
是公共的,并且您以某种方式引用了另一个视图控制器,那么这就是otherViewController.collectionView
。请注意,不能仅对其他视图控制器进行新引用,否则将调整新实例上的层,而不是原始实例上的层
最后但并非最不重要的一点是,您正在强制展开collectionView
——不要这样做。如果你的应用程序为零,它将崩溃。相反,利用Swift的范例:
if let collView = collectionView {
collView.layer...// etc
}
这最后一点不是问题,只是良好的实践。这里可能有一些问题 如果您想说
ViewController.displayCircle()
,那么displayCircle
需要是一个静态函数。但我不认为这是您的意图,在这种情况下您可能不想这样做,而且您的静态函数语法也是错误的(ViewController().displayCircle()
是错误的)。但接下来……:)
ViewController().displayCircle()
不是正确引用collectionView的方式。首先,需要对另一个视图控制器的引用。然后在displayCircle
中,如果它位于另一个视图控制器中,则需要获取对collectionView
的引用。如果collectionView
是公共的,并且您以某种方式引用了另一个视图控制器,那么这就是otherViewController.collectionView
。请注意,不能仅对其他视图控制器进行新引用,否则将调整新实例上的层,而不是原始实例上的层
最后但并非最不重要的一点是,您正在强制展开collectionView
——不要这样做。如果你的应用程序为零,它将崩溃。相反,利用Swift的范例:
if let collView = collectionView {
collView.layer...// etc
}
最后一点不是问题所在,只是良好的实践。如果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
let pvc = self.parent as? UIPageViewController
let viewControllers = pvc.viewControllers.filter { $0 is CustomSubclass }
if let viewController = viewControllers.first as? CustomSubclass {
viewController.displayCircle()
}
您可能需要找出所需的索引。另一种方法是确保UIPageViewController
的每个子视图控制器都有自己的子类,然后按如下方式查找所需的子类:
let pvc = self.parent as? UIPageViewController // Or your custom class
let targetViewController = pvc.viewControllers[index] as? YourTargetViewControllerClass
let pvc = self.parent as? UIPageViewController
let viewControllers = pvc.viewControllers.filter { $0 is CustomSubclass }
if let viewController = viewControllers.first as? CustomSubclass {
viewController.displayCircle()
}
正如另一个答案所述,使用ViewController()
创建一个全新的视图控制器实例,而不是已经存在的实例。如果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
let pvc = self.parent as? UIPageViewController
let viewControllers = pvc.viewControllers.filter { $0 is CustomSubclass }
if let viewController = viewControllers.first as? CustomSubclass {
viewController.displayCircle()
}
您可能需要找出所需的索引。另一种方法是确保UIPageViewController
的每个子视图控制器都有自己的子类,然后按如下方式查找所需的子类:
let pvc = self.parent as? UIPageViewController // Or your custom class
let targetViewController = pvc.viewControllers[index] as? YourTargetViewControllerClass
let pvc = self.parent as? UIPageViewController
let viewControllers = pvc.viewControllers.filter { $0 is CustomSubclass }
if let viewController = viewControllers.first as? CustomSubclass {
viewController.displayCircle()
}
正如另一个答案所述,使用ViewController()
创建一个全新的视图控制器实例,不是已经存在的视图。您必须在自己的视图控制器实例中找到collectionView:myViewController。collectionView
-查找视图控制器取决于应用程序的viewController结构。因此,问题是我调用