Как представить UIViewController поверх UICollectionView? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть UICollectionView, который отображает миниатюру изображений. Когда я нажимаю на эту ячейку (миниатюру), я использую функцию ниже, чтобы нажать на другую UIViewController, которая затем позволяет загружать и просматривать увеличенное изображение миниатюры. У меня есть UIButton в каждой клетке. Я хотел бы представить еще один viewController, который будет выступать в качестве пользовательского всплывающего окна, и я надеюсь отобразить более подробную информацию об изображении, например, имя файла, дату и т. Д. ... При установке соединения action для пользовательского класса UICollectionViewCell и в методе функции IBAction я не могу «представить» этот пользовательский UIViewController. Xcode просто не распознает «настоящее». Пожалуйста, кто-нибудь может посоветовать?

 class CollectionViewFolder: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate ,UICollectionViewDelegateFlowLayout{

 ...

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

     }

 ...
 }

Пользовательский:

 class CollectionViewFolderCell: UICollectionViewCell {

      @IBAction func moreInfoBtn(_ sender: Any) {

           // DOES NOT RECOGNIZE 'present' - TO PRESENT ANOTHER UIVIEWCONTROLLER

       }


 }

Ответы [ 2 ]

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

Создайте протокол в вашем CollectionViewFolderCell.swift

protocol CollectionViewFolderCellDelegate {
    func collectionViewFolderCellDidPressButton()
}

А внутри CollectionViewFolderCell объявить делегата как:

var delegate: CollectionViewFolderCellDelegate?

Внутри вашего действия кнопки добавьте:

@IBAction func moreInfoBtn(_ sender: Any) {

     delegate?.collectionViewFolderCellDidPressButton()

 }

В вашем методе cellForItemAtIndexPath добавьте cell.delegate = self

func collectionView(collectionView: UICollectionView,
                          cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewFolderCell
    cell.delegate = self

    return cell
}

Кроме того, в вашем контроллере просмотра необходимо указать CollectionViewFolderCellDelegate

extension CollectionViewFolder: CollectionViewFolderCellDelegate {
    // here you can present your desired view controller
}
0 голосов
/ 07 сентября 2018

present(_:animated:completion:) является UIViewController. Чтобы иметь возможность показать (представить, нажать, выскочить и т. Д.) Еще один UIViewController, вы должны быть UIViewController (или конкретным в случае пуша и т. Д.). Так что CollectionViewFolderCell не может представить ваш новый UIViewController.

Затем вам нужно сказать UIViewController (в вашем случае CollectionViewFolder), что ваша клетка (в вашем случае CollectionViewFolderCell через UICollectionView) должна сделать это. Для этого вы можете использовать шаблон делегата или замыкание.

Быстрый пример кода с закрытием:

Добавить объект к CollectionViewFolderCell:

var onMoreInfoTap: ((ParamTypeOrClass1, ParamTypeOrClass2, etc) -> Void)?

Затем измените ваш метод:

@IBAction func moreInfoBtn(_ sender: Any) {
    //Compute all your params, let's name them param1, param2, etc.
    self.onMoreInfoTap?(param1, param2, etc.   
}

Вкл. func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell:

cell.onMoreInfoTap = { [weak self] (param1Name, param2Name, etc) in 
     let viewController = //Create your target UIViewController
     //Set its customs var according to Param1Name, Param2Name, etc.
     self?.present(viewController, animated: true, completion:nil)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...