CollectionView 2 раздела. Как получить доступ к розетке Vars из внутреннего класса в Swift - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть 2 раздела в моей коллекции: изображения и альбомы. У каждого раздела своя логика. При нажатии на альбом - загружаются некоторые фотографии. Нажав на изображение, я хочу получить доступ к переменной UIView на выходе, но не могу, так как с помощью метода indexSath didSelectItemAt внутри внутреннего класса.

class TwoViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

        @IBOutlet var pickedPhotoView: UIView!

        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            let cell = collectionView.cellForItem(at: indexPath) as! AlbumCell


           <b>// Here is ok. i can access the pickedPhotoView variable</b>

            view.addSubview(pickedPhotoView)


        }


    class ImagesCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            // but here there is no chance to access pickedPhotoView variable


    }
}     

Обновление:

 class TwoViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, ImagesCellDelegate {

        func doSomething(_ sender: ImagesCell) {
            print("do something")
        }


        var imagesCell: ImagesCell = ImagesCell()

        override func viewDidLoad() {
            super.viewDidLoad()
            imagesCell.delegate = self
       }
}

protocol ImagesCellDelegate {
    func doSomething(_ sender: ImagesCell)
}

class ImagesCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var delegate: ImagesCellDelegate!

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

        delegate?.doSomething(self)

    }
}

Функция doSomething не выполняется в TwoViewController. Я думаю, что я делаю что-то не так с:

var imagesCell: ImagesCell = ImagesCell()
imagesCell.delegate = self

Есть идеи? Thanx!

Решение:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     cell.delegate = self
}

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

решение:

class TwoViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, ImagesCellDelegate {

        func doSomething(_ sender: ImagesCell) {
            print("do something")
        }


        var imagesCell: ImagesCell = ImagesCell()

        override func viewDidLoad() {
            super.viewDidLoad()
            imagesCell.delegate = self
       }
}

protocol ImagesCellDelegate {
    func doSomething(_ sender: ImagesCell)
}

class ImagesCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var delegate: ImagesCellDelegate!

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

        delegate?.doSomething(self)

    }
}

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
         // just added this code in function
         cell.delegate = self
    }
0 голосов
/ 25 апреля 2018

Почему вы должны сделать ImagesCell внутренним классом? «Элемент экземпляра« selectedPhotoView »типа« TwoViewController »не может использоваться для экземпляра вложенного типа« TwoViewController.ImagesCell »» Вы можете сделать ImagesCell вне TwoViewController так же, как AlbumCell.

0 голосов
/ 25 апреля 2018

Вкратце, вам нужен шаблон делегата в iOS.


Коды следующие.

class ImagesCell : : UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var delegate: ImagesCellDelegate!
}

protocol ImagesCellDelegate {
    func doSomething()
}

extension TwoViewController: ImagesCellDelegate {
    func doSomething() {
        // pickedPhotoView can be accessed here
    }
}


Подробнее

UITableViewCell и UICollectionViewCell не должны обращаться к переменным-членам в UIViewController. Эти ячейки должны фокусироваться на представлении их пользовательского интерфейса и не должны включать какие-либо знания об их родительском контроллере представления.

Таким образом, эти ячейки могут быть легко использованы в другом UIViewController. Те UIViewController просто знают, когда они хотят использовать ImagesCell, они MUST реализуют ImageCellDelegate протокол.

0 голосов
/ 25 апреля 2018

Я не могу комментировать, потому что мне не хватает репутации, но ваш вопрос неясен.У вас есть 2 section -> вы можете определить текущий раздел выбора в TwoViewController.

if indexPath.section == 0 {
// album
} else if indexPath.section == 1 {
// photo 
}

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

...