Collection View возвращает ноль при вызове в функции - PullRequest
0 голосов
/ 19 мая 2018

Я хочу запустить функцию, которая включает в себя добавление подслоя в представление коллекции.Однако, когда я запускаю функцию, приложение вылетает, говоря 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 голосов
/ 19 мая 2018

Вероятно, здесь есть несколько проблем.

Если вы хотите сказать ViewController.displayCircle(), тогда displayCircle должно быть статической функцией.Но я не думаю, что это было вашим намерением, вы, вероятно, не хотите делать это в этом случае, а также синтаксис статической функции неверен (ViewController().displayCircle() неверен).Но двигаться дальше ...:)

ViewController().displayCircle() - это не то, как вы правильно ссылаетесь на collectionView.Сначала вам нужна ссылка на другой контроллер вида.Затем внутри displayCircle вам нужно получить ссылку на collectionView, если она находится в другом View Controller.Так что это будет otherViewController.collectionView при условии, что collectionView общедоступен, конечно, и при условии, что у вас есть какая-то ссылка на этот другой контроллер представления.Обратите внимание, что вы не можете просто сделать новую ссылку на другой контроллер представления, иначе вы будете корректировать слой на новом экземпляре, а не на оригинале.

И последнее, но не менее важное: вы принудительно разворачиваетеcollectionView - не делай этого.Ваше приложение потерпит крах, если оно когда-либо будет равно нулю.Вместо этого воспользуйтесь парадигмами Свифта:

if let collView = collectionView {
     collView.layer...// etc
}

Этот последний бит не проблема, а просто хорошая практика.

0 голосов
/ 19 мая 2018

Если 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() создаетновый экземпляр контроллера представления, а не тот, который уже существует.

0 голосов
/ 19 мая 2018

Этот

ViewController()

создает новый экземпляр, отличный от представленного, когда вы ссылаетесь на collectionView из него, он фактически равен нулю, так как вы должны загрузить VC либо из раскадровки / XIB, так что вы должныиспользуйте делегат для ссылки на текущий VC, который содержит collectionView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...