Не удается сослаться на выходные данные ячеек коллекции в View Controller - PullRequest
0 голосов
/ 19 октября 2018

Мое приложение содержит статическое представление коллекции внутри стандартного UIView.Мне нужно позволить элементам UIView общаться с элементами в UICollectionView.Проблема здесь заключается в том, что когда я рассматриваю предложенные методы для ссылки одного класса на другой, значение элемента пользовательского интерфейса возвращает ноль.Есть идеи, как это можно предотвратить?Ниже приведен пример.

class ViewController: UIViewController {
let cellIds = ["Purple Cell","Green Cell","Blue Cell","Red Cell"]
let cellSizes = Array(repeatElement(CGSize(width: 170, height: 80), count: 4))
     override func viewDidLoad() {
         super.viewDidLoad()
         // Do any additional setup after loading the view, typically from a nib.
     }

@IBOutlet weak var wowNiceOutlet: UILabel!

 }
 class MyCollectionViewCell: UICollectionViewCell {
     @IBOutlet var myButton: UIButton!
     @IBAction func myButtonPressed(_ sender: UIButton) {
         myButton.setTitle("eat UICollectionView", for: .normal)
         let theViewControl = ViewController()
         **theViewControl.wowNiceOutlet.text = "wow nice"** //This line returns nil, causing an error.
     }

 }

Спасибо!Дайте мне знать, если у вас есть какие-либо вопросы!

Обновлен код в соответствии с Sh_Khan:

class ViewController: UIViewController {
let cellIds = ["Purple Cell","Green Cell","Blue Cell","Red Cell"]
let cellSizes = Array(repeatElement(CGSize(width: 170, height: 80), count: 4))
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

var thisString = "nice string"
   //Theoretically thisString would be changed by a Stepper and upon doing that 
   //would be changing visual properties of the, in this case, label.
@IBOutlet weak var wowNiceOutlet: UILabel!

}
 class MyCollectionViewCell: UICollectionViewCell {
weak var parentVC:ViewController?
@IBOutlet var greenLabel: UILabel!
@IBOutlet var myButton: UIButton!
@IBAction func myButtonPressed(_ sender: UIButton) {
    myButton.setTitle("eat UICollectionView", for: .normal)

    parentVC?.wowNiceOutlet.text = "wow nice"
}

 }
  extension ViewController: UICollectionViewDataSource {
func collectionView( _ collectionView: UICollectionView, numberOfItemsInSection 
  section: Int) -> Int {
    return cellIds.count

}
func collectionView( _ collectionView: UICollectionView, cellForItemAt 
  indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: 
  cellIds[indexPath.item], for: indexPath) as! MyCollectionViewCell // Get cell
    cell.parentVC = self
    cell.greenLabel.text = thisString
    return collectionView.dequeueReusableCell( withReuseIdentifier: 
 cellIds[indexPath.item], for: indexPath)

}

 }
 extension ViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout 
 collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: 
  IndexPath) -> CGSize {
    return cellSizes[indexPath.item]

}

 }
  extension ViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt 
  indexPath: IndexPath) {
    print(cellIds[indexPath.row]);


}

 }

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вы создаете новый let theViewControl = ViewController(), который не совпадает с ViewController, который у вас был раньше.Вы должны передать его из вашего оригинального ViewController в клетку.

0 голосов
/ 19 октября 2018

Вам нужно добавить эту переменную в подкласс ячейки CollectionView

weak var parentVC:ViewController?

Затем установить ее внутри cellForItemAt

cell.parentVC = self

После этого использовать ее вот так

parentVC?.wowNiceOutlet.text = "wow nice"

Причиной сбоя является то, что выход wowNiceOutlet равен нулю

let theViewControl = ViewController()
theViewControl.wowNiceOutlet.text = "wow nice"

, поскольку вы загружаете виртуальный канал программно, а не из storyborad.instantiate, плюс это еще один экземпляр


Вы возвращаете другой экземпляр ячейки, кроме той, для которой вы установили делегата

func collectionView( _ collectionView: UICollectionView, cellForItemAt 
  indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: 
  cellIds[indexPath.item], for: indexPath) as! MyCollectionViewCell // Get cell
    cell.parentVC = self

    cell.someLabel.text = "anyvalue" // <<< edit here 

    return cell

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