Как я могу получить заголовок кнопки для каждой выбранной ячейки в UICollectionView? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть коллекция кнопок, как показано ниже. Я хочу иметь возможность выбрать несколько из этих ячеек, и при этом передать название каждой выбранной кнопки в массив строк.

UICollectionView - в каждой ячейке есть кнопка с заголовком

UICollectionView находится в классе WordViewController

class WordViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout

И UICollectionViewCell находится в своем собственном файле.

import UIKit

class WordCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var wordView: UIButton!

@IBAction func buttonTapped(_ sender: UIButton) {
    if wordView.isSelected == true {
        wordView.isSelected = false
        wordView.backgroundColor = UIColor.blue
    }else {
        wordView.isSelected = true
        wordView.backgroundColor = UIColor.green
    }  
}

}

Я очень новичок в Swift, и я пытался найти ответ на этот вопрос в течение нескольких дней, но я не могу понять это. Я подозреваю, что мне, возможно, придется использовать indexPathsForSelectedItems, но я пробовал это и не могу заставить его работать.

func indexSelected () {
        let collectionView = self.collectionView
        let indexPath = collectionView?.indexPathsForSelectedItems?.first
        print(indexPath!)
        let cell = collectionView?.cellForItem(at: indexPath!) as? WordCollectionViewCell
        let data = cell?.wordView.currentTitle
        print(data!)

}

Я не уверен, что у меня что-то принципиально неправильное в том, как я настроил свой CollectionView, или это связано с использованием кнопок внутри CollectionViewCells.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Добро пожаловать на SO. Это немного похоже на проблему X / Y: случай, когда вы спрашиваете о том, как реализовать конкретное (часто неоптимальное) решение, а не спрашиваете о том, как решить проблему в первую очередь.

Не следует рассматривать представления в представлении вашей коллекции как сохранение данных. (кнопки - это виды.)

Вы должны использовать кнопку, чтобы выяснить indexPath ячейки, которую коснулся пользователь, а затем просмотреть информацию в вашей модели данных.

Вам следует установить массив структур (или массив массивов, если представление вашей коллекции состоит из секций строк). Каждая из этих структур должна содержать текущие настройки для ячейки.

Ваш метод collectionView(_:cellForItemAt:) должен использовать массив структур для настройки вашей продажи для отображения.

Когда пользователь нажимает кнопки и выбирает ячейки, вы должны обновить структуру (-ы) в соответствующем (-ых) IndexPath-ах, а затем указать представлению коллекции обновить эти ячейки.

Если вам нужно что-то сделать с выбранными ячейками, вам следует запросить в представлении коллекции массив выбранных ячеек, вы должны использовать эти IndexPath для индексации в массиве вашей модели и извлечения структуры для каждого IndexPath, а затем посмотреть данные, которые вам нужны.

EDIT:

Вы можете использовать действительно простое расширение для UICollectionView, чтобы найти indexPath любого представления внутри представления коллекции (а кнопка, как уже упоминалось, является представлением ...)

extension UICollectionView {
    func indexPathForCellContaining( view: UIView) -> IndexPath? {
        let viewCenter = self.convert(view.center, from: view.superview)
        return self.indexPathForItem(at: viewCenter)
    }
}
0 голосов
/ 04 сентября 2018

Это один из способов сделать это. Сначала получите indexPaths для выбранных ячеек. Затем выполните цикл по indexPaths и получите ячейку для каждого IndexPath (приведите их как свой собственный CollectionViewCell для доступа к вашей кнопке). Теперь вы можете добавить каждый заголовок в массив, чтобы сохранить их.

var titleArray = [String]()

    guard let selectedIndexPaths = collectionView.indexPathsForSelectedItems else { return }

    for indexPath in selectedIndexPaths {
        if let cell = collectionView.cellForItem(at: indexPath) as? WordCollectionViewCell {
            self.titleArray.append(cell.yourButton.titleLabel?.text)
        }
    }
...