Я пытаюсь передать значение из элемента UICollectionView в UIButton в Swift 4 - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть UICollectionViewCell.Эта ячейка зарегистрирована в другом UICollectionViewCell, который, в свою очередь, зарегистрирован в viewDidLoad из UIViewController, называемого FilterCollectionViewController.Когда выбрана первая ячейка, ей следует передать значение типа String в UIButton.Этот UIButton находится в FilterCollectionViewController

. В FilterCollectionViewController я создал переменную с именем colorName

var colorName: String!{
    didSet {
        print(colorName)
    }
}

, в том же классе есть UIButton.

@objc func addButtonFunc(sender:UIButton){
    print(colorName)
    }

В FilterCollectionViewController я объявляю UICollectionView.В этом collectionView есть «второй» UICollectionView, который имеет функцию:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let filterVC = FilterCollectionViewController()
    filterVC.colorName = "blau"    
}

При нажатии на ячейку со второй UICollectionView я могу напечатать значение colorName из didSet(в основном FilterCollectionViewController).Тем не менее, я хочу, чтобы он был передан в UIButton.При нажатии этой кнопки UIB она должна обрабатывать эту строку дальше.Однако метод print приводит к nil

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Сначала вам нужно перейти на раскадровку и установить идентификатор"yourViewId" на

FilterCollectionViewController

, затем

в этом методе

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let viewController = self.storyboard.instantiateViewController(withIdentifier:"yourViewId") as! FilterCollectionViewController
viewController.colorName = "red"
self.present(viewController, sender:nil)
}
0 голосов
/ 07 января 2019

Я нашел ответ на проблему.

В родительском FilterCollectionViewController я сделал переменную colorName, как

var colorName: String!

во втором UIVieControllerCell Я объявил переменнуюкласса Parent ViewController

var colorName: FilterCollectionViewController?

Таким образом, во втором UICollectionView в функции didSelectItemsAt я добавил следующий код

colorName?.colorName = "blau"

Это должно было быть объявлено снова в первом UICollectionview, родитель второго UICollectionView и ребенок FilterCollectionViewController.Объявление было в функции cellForItemAt

cell.colorName = self

И это все.Название цвета обновляется при нажатии кнопки.

Вот сокращенный код:

class FilterCollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

var colorName: String!

override func viewDidLoad() {
        super.viewDidLoad()
//...register UICollectionview declare button etc.
}

 @objc func addButtonFunc(sender:UIButton){  
    print(colorName)
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellID", for: indexPath) as! FilterCell

        cell.colorName = self

        return cell
    }

А в классе FilterCell:

var colorName: FilterCollectionViewController?
//Class is initialised with  function, in the function another UUICollectionView is registered.
//...functions like numberOfItemsInSection and cellForItemAt are declared

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    colorName?.colorName = "blau"

}
0 голосов
/ 28 декабря 2018

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

Создайте переменную наподобие

var colorName: String {
    didSet {
        print(colorName)
    }
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    colorName = "blau"  
}

Тогда в addButton действие,

@objc func addButton(sender: UIButton){
    print(colorName)
}
...