Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在函数中调用时,集合视图返回nil_Ios_Swift_Uicollectionview_Swift4 - Fatal编程技术网

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结构。因此,问题是我调用