Как мне ссылаться на данные конкретной ячейки в ее делегате? - PullRequest
0 голосов
/ 27 июня 2019

Я только начинаю с делегатами в Свифте.У меня есть collectionView, который будет заполнен конкретными ячейками.Каждая ячейка будет иметь кнопку «Мне нравится», где пользователь может нажать ее, каждое нажатие должно переключаться между двумя различными изображениями сердца.Я настроил делегата и его протокол в классе ячеек.Я вызываю делегата в классе контроллера представления, который содержит коллекцию ячеек.Как я должен изменить изображение сердечной кнопки определенной ячейки, если оно не позволяет мне ссылаться на ячейку и ее свойства?Спасибо !!

Я, очевидно, пытался вызвать переменную heart-button-image IB Action, не повезло.мне нужно просто объединить мой делегат с функцией: "func collectionView (_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell"?Это, конечно, позволяет вам ссылаться на конкретную ячейку, но кажется, что это неправильный подход.

ТАМОЖЕННЫЙ КЛЕТОЧНЫЙ КЛАСС, КОТОРЫЙ ПРОХОДИТ ИНИЦИАЛИЗАЦИЯ ДЕЛЕГАТА:

 protocol EventCellDelegate: class {
func likeButtonPressed(toggle: Int)
}

class ProfileEventCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var likeCount: UILabel!
@IBOutlet weak var friendsGoing: UILabel!
@IBOutlet weak var friendGoingPic: UIImageView!
@IBOutlet weak var eventName: UILabel!
@IBOutlet weak var eventDate: UILabel!
@IBOutlet weak var eventTime: UILabel!
@IBOutlet weak var eventOrg: UILabel!
@IBOutlet weak var eventPic: UIImageView!
@IBOutlet weak var eventPrice: UIButton! // WHERE THE HEART IMAGE         GOES (bad name sorry)

weak var delegate: EventCellDelegate?
var likeToggle = 1
/*
let redHeart = UIImage(named: "likeheart")
let grayHeart = UIImage(named: "unlikeheart")
var likeToggle  = 1
var likeCountValue = 347
*/

@IBAction func eventPricePressed(_ sender: UIButton) {

    delegate?.likeButtonPressed(toggle: 1)
}
}

ДЕЛЕГАТИЧЕСКАЯ ФУНКЦИЯ ВНУТРИ МОЕГО ДОМА КЛАСС КОНТРОЛЛЕРА ПРОСМОТРА:

extension HomeViewController: EventCellDelegate {
func likeButtonPressed(toggle: Int) {
    //ProfileEventCollectionViewCell.eventPrice  <-- doesnt allow
        likeToggle = likeToggle + toggle          <-- doesnt find
        likeToggle
    if (likeToggle % 2 == 0) {
        eventPrice.setImage(redHeart, for: .normal)
        //likeCountValue = likeCountValue + 1
    } else {
        eventPrice.setImage(grayHeart, for: .normal)
        //likeCountValue = likeCountValue - 1

    }
}

}

Элемент экземпляра 'eventPrice' нельзя использовать для типа 'ProfileEventCollectionViewCell'

Использование неразрешенного идентификатора 'likeToggle'

1 Ответ

0 голосов
/ 27 июня 2019

Ваша функция делегата должна передать ячейку, в которой была нажата кнопка «Мне нравится»:

protocol EventCellDelegate: class {
    func likeButtonPressed(in cell: ProfileEventCollectionViewCell)
}

Затем вы можете вызвать функцию делегата как:

@IBAction func eventPricePressed(_ sender: UIButton) {
    delegate?.likeButtonPressed(in:self)
}

Вам не нужно передавать значение toggle - Контроллер представления может решить, что ему нужно делать при нажатии кнопки.

Я бы не обновлял ячейку прямо в методе делегата; Обновите модель данных и перезагрузите ячейку - ваш cellForItemAt: может обработать обновление внешнего вида.

И ваша реализация функции делегата будет выглядеть примерно так:

func likeButtonPressed(in cell:ProfileEventCollectionViewCell) {

    guard let indexPath = self.collectionView.indexPath(for: cell) else {
        return
    }

    let myObject = myDataSource[indexPath.item]
    myObject.liked.toggle
    self.collectionView.reloadItems(at: [indexPath])
}
...