Swift - получить UIImage от UIColllectionViewCell - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть collectionView, где каждый cell содержит UIImage и пустой UIButton. Как мне изображение, на которое пользователь нажал?

class ImageCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout{

    @IBOutlet weak var imageCollectionView: UICollectionView!

    let images: [UIImage] = [
        UIImage(named: "beerImage")!,
        UIImage(named: "christmasImage")!,
        UIImage(named: "goalImage")!,
        UIImage(named: "travelImage")!,
        UIImage(named: "rollerImage")!,
        UIImage(named: "giftImage")!,
        UIImage(named: "shirtImage")!,
        UIImage(named: "dressImage")!,

    ]

    let columnLayout = FlowLayout(
        itemSize: CGSize(width: 150, height: 150),
        minimumInteritemSpacing: 30,
        minimumLineSpacing: 10,
        sectionInset: UIEdgeInsets(top: 20, left: 20, bottom: 10, right: 20)
    )

    var colViewWidth: CGFloat = 0.0

    override func viewDidLoad() {

        self.imageCollectionView.collectionViewLayout = columnLayout

        super.viewDidLoad()

        imageCollectionView.dataSource = self
        imageCollectionView.delegate = self
    }

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath) as! ImageCollectionViewCell

        cell.imageView.image = images[indexPath.item]
        cell.layer.cornerRadius = 2
        return cell
    }

    @IBAction func imageButtonTapped(_ sender: Any) {
        print("tapped")
    }


    @IBAction func closeButtonTapped(_ sender: Any) {
        let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let HomeViewController = storyBoard.instantiateViewController(withIdentifier: "HomeVC") as! ExampleViewController
                self.present(HomeViewController, animated: false, completion: nil)
    }
}

Обновление

В конце я хотел бы передать это изображение другому ViewController. Я пробовал это таким образом, но изображение не отображается в другом ViewController:

ViewControllerA

var tappedImage = UIImage()
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    tappedImage = images[indexPath.row]
}

var showPopUpView = true

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print(showPopUpView)
    var vc = segue.destination as! ExampleViewController
    vc.pickedImage = self.tappedImage
    vc.ShowPopUpView = self.showPopUpView

}

ViewControllerB

    var pickedImage = UIImage()

override func viewDidLoad() {
        super.viewDidLoad()

        imagePreview.image = pickedImage

Ответы [ 3 ]

4 голосов
/ 08 ноября 2019

Вы могли бы сделать что-то вроде этого

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    imageToPass = images[indexPath.row]
}

Редактировать: Что касается передачи этого изображения в ваш следующий контроллер представления, одним из возможных способов является добавление свойства в ваш первый и второй контроллеры представления для изображения. установите это изображение в вызове didSelectItemAt, затем передайте его, используя prepare(for segue: UIStoryboardSegue, sender: Any?)

let imageToPass: UIImage?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == "identifier name here" {

       // Get the new view controller using segue.destination.
       if let destVC = segue.destination as? SecondViewController {
           // Pass the selected object to the new view controller.
           destVC.image = imageToPass
       }
   }
}
3 голосов
/ 08 ноября 2019

Дуо к разговору в комментариях:

Порядок действий должен быть:

  1. Пользователь нажимает на ячейку
  2. Выбор изображения в соответствии с indexPath выбранной ячейки
  3. Установка ее во временную переменную (tappedImage)
  4. Выполнение перехода
  5. Передача временного изображения во временное изображение назначения (pickedImage)
  6. Загрузка вида назначения
  7. Показать изображение.

Похоже, вы пропустили один из этих шагов (возможно, шаг 3, поскольку вы не звонитеperformSegue в ...didSelectItemAt indexPath... и, возможно, он вообще не вызывается! Попробуйте напечатать что-нибудь там и проверьте, верно ли это)

Или вы можете нарушить порядок (возможно, вы устанавливаете изображение после адресат View загружен, и в результате этого не видно.)

Отладка:

Попробуйте напечатать все переменные, к которым у вас есть доступ (например, tappedImage, pickedImage, images[indexPath.row] и т. Д.) В каждом из этих 7 штатов и посмотрите, где проблема и гдеВы теряете ссылку на выбранное изображение

Возможная проблема

Вы не используете ...didSelectItemAt indexPath... до performSegue, Возможно, у вас есть UIButton для этого, поэтому кнопка блокирует cell от выбора.

0 голосов
/ 08 ноября 2019

Попробуйте это

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let image = images[indexPath.row]
    //Result image
}

(или) Если вы хотите получить изображение от нажатия кнопки (не рекомендуется)

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
   let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath) as! ImageCollectionViewCell

   cell.imageView.image = images[indexPath.item]
   cell.layer.cornerRadius = 2

   //Replace your button
   cell.yourButton.tag = indexPath.row
   cell.yourButton.addTarget(self, action: #selector(self.imageButtonTapped(_:)), for: .touchUpInside)
}

в действии кнопки

func imageButtonTapped(_ sender: UIButton) {
   let image = images[sender.tag]
   //Result image
}
...