在函数中调用时,Collection View返回nil

时间:2018-05-19 14:21:54

标签: ios swift uicollectionview swift4

我想运行一个涉及向集合视图添加子图层的函数。但是,当我运行该函数时,应用程序崩溃说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()

编辑:这是我的故事板布局......

enter image description here

问题是什么?

如您所见,我正在使用页面视图控制器。希望这有帮助

3 个答案:

答案 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