Как узнать, какая картинка в какой ячейке таблицы была затронута?

У меня есть пользовательские tableViewCells в моем tableView. У них есть 2 или более ImageView внутри ячейки, к которым можно прикоснуться, а затем они отскочат и будут выбраны. Но поскольку ячейки используются повторно, как узнать, какой ImageView в какой строке был выбран? Я знаю, что могу получить indexPath.row, но как мне узнать, какое из 2 или 3 изображений активировало функцию, чтобы дать мне indexPath? Надеюсь, вы понимаете, что я имею в виду. Вот мой пользовательский tableViewCell, код tableView просто стандартный.

import UIKit

class TwoPicsTableViewCell: UITableViewCell {

@IBOutlet var containerView: UIView!
@IBOutlet var votesButton: UIButton!
@IBOutlet var commentsButton: UIButton!
@IBOutlet var firstImage: bouncingRoundImageView!
@IBOutlet var secondImage: bouncingRoundImageView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var descriptionLabel: UILabel!
@IBOutlet var topUsernameLabel: UILabel!
@IBOutlet var bottomUsernameLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    //self.layoutIfNeeded()
    containerView.layer.cornerRadius = 10
    containerView.clipsToBounds = true
    self.backgroundColor = ColorScheme.primaryColor
    votesButton.setTitleColor(ColorScheme.fourthColor, for: UIControlState())
    commentsButton.setTitleColor(ColorScheme.fourthColor, for: UIControlState())

    setupBackgroundGradient()
    setupFirstImage()
    setupSecondImage()
}

func setupBackgroundGradient() {

    let bottomColor = ColorScheme.secondaryColor.cgColor
    let topColor = ColorScheme.thirdColor.cgColor

    let layer = CAGradientLayer()
    layer.frame = containerView.frame
    layer.frame.offsetBy(dx: -10,dy:-10)
    layer.frame.size.width += 10
    layer.frame.size.height += 10
    layer.colors = [topColor, bottomColor]

    containerView.layer.insertSublayer(layer, at: 0)

}

func setupFirstImage() {

    let tappedOne = UITapGestureRecognizer(target: self, action: #selector(checkPicTwo))
    firstImage.addGestureRecognizer(tappedOne)
}

func setupSecondImage() {

    let tappedTwo = UITapGestureRecognizer(target: self, action: #selector(checkPicOne))
    secondImage.addGestureRecognizer(tappedTwo)
}

func checkPicTwo() {

    firstImage.bouncing()
    vote(voteForPic: firstImage)

    if secondImage.layer.borderWidth != 0 {
        secondImage.layer.borderWidth = 0
    }
}

func checkPicOne() {

    secondImage.bouncing()

    if firstImage.layer.borderWidth != 0 {
        firstImage.layer.borderWidth = 0
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    firstImage.image = nil
    secondImage.image = nil
    firstImage.layer.borderWidth = 0
    secondImage.layer.borderWidth = 0
}

}

person beginner_T    schedule 05.10.2016    source источник
comment
У вас уже есть жесты касания для каждого изображения, так что теперь вы знаете, к какому изображению прикоснулись. В чем проблема?   -  person Hossam Ghareeb    schedule 05.10.2016
comment
true, но жест касания находится внутри класса tableViewCell. Итак, как мне получить indexPath оттуда? Я просто знаю, что могу получить indexPath из UITableView внутри класса UITableView, но тогда мне нужно будет добавить еще один распознаватель жестов к изображениям, что кажется неправильным?!   -  person beginner_T    schedule 05.10.2016
comment
Вам нужен делегат для запуска события в контроллере представления о том, что ячейка была затронута. ViewController имеет ссылку на представление таблицы и может предоставить вам indexPath, вызвав функцию tableview.indexPathForCell.   -  person Hossam Ghareeb    schedule 05.10.2016
comment
Может быть, вы можете показать мне, как это сделать? Я действительно не понимаю, что вы имеете в виду.   -  person beginner_T    schedule 05.10.2016
comment
Этот ответ может помочь /38941510#38941510" title="swift, как получить строку indexpath при нажатии кнопки в ячейке"> stackoverflow.com/questions/28659845/   -  person Paulw11    schedule 05.10.2016
comment
@Mr.UB ответил вам той же идеей. Я собирался опубликовать код, но он оказался быстрее :)   -  person Hossam Ghareeb    schedule 05.10.2016
comment
все равно спасибо за помощь!   -  person beginner_T    schedule 05.10.2016


Ответы (1)


protocol TwoPicsTableViewCellDelegate{
    func image1Clicked(cell:TwoPicsTableViewCell)
    func image2Clicked(cell:TwoPicsTableViewCell)
}

class TwoPicsTableViewCell: UITableViewCell {

    var delegate:TwoPicsTableViewCellDelegate!

    func checkPicTwo() {

        firstImage.bouncing()
        vote(voteForPic: firstImage)

        if secondImage.layer.borderWidth != 0 {
            secondImage.layer.borderWidth = 0
        }

        //delegate call
        delegate.image1Clicked(self)
    }

    func checkPicOne() {

        secondImage.bouncing()

        if firstImage.layer.borderWidth != 0 {
            firstImage.layer.borderWidth = 0
        }

        //delegate call
        delegate.image2Clicked(self)
    }
}

В контроллере представления подтвердите это:

class myViewController: UIViewController, TwoPicsTableViewCellDelegate{


    //implement delegate methods

    func image1Clicked(cell:TwoPicsTableViewCell){
        let indexPath = tableview.indexPathForCell(cell)
        print(indexPath)
    }

    func image2Clicked(cell:TwoPicsTableViewCell){
        let indexPath = tableview.indexPathForCell(cell)
        print(indexPath)
    }


    func table cellForRowAt..........{
        let cell = table.dequeCellAt..........   as? TwoPicsTableViewCell
        //Assign delegate
        cell.delegate = self
        .......
        .......

        return cell

    }

}
person Bista    schedule 05.10.2016
comment
Большое спасибо! Я попробую это как можно скорее! - person beginner_T; 05.10.2016
comment
определили его в классе ячеек таблицы, как я уже упоминал в ответе выше? var delegate:TwoPicsTableViewCellDelegate! - person Bista; 05.10.2016
comment
это была моя ошибка: D создание приложения работает, но когда я нажимаю на изображение, я получаю сообщение об ошибке: неожиданно найден ноль при развертывании необязательного значения :( - person beginner_T; 05.10.2016
comment
извините, снова моя ошибка :D Я поместил cell.delegate = self не в ту ячейку.. работает отлично!!! Большое спасибо! - person beginner_T; 05.10.2016
comment
Почему-то это работает для всех TwoPicsTableViewCells, кроме самого первого?! У вас есть идеи, почему? Я больше не могу щелкнуть первую ячейку - person beginner_T; 05.10.2016
comment
Теперь я заметил, что это не только первое.. почему некоторые работают идеально, а некоторые просто не реагируют вообще? я даже не могу нажать на них - person beginner_T; 06.10.2016
comment
Этого не должно происходить, изображения слишком маленькие? - person Bista; 06.10.2016
comment
Я исправил это.. Проблема заключалась в том, что сначала у меня просто есть ячейка по умолчанию типа twoPicsTableViewCell, которая просто говорит о загрузке, а изображения скрыты ... затем я загружаю данные из firebase и перезагружаю tableView с данными и показываю снова imageViews... Я до сих пор не знаю, почему это влияет на некоторые случайные ячейки, но когда я не помещаю ячейку по умолчанию перед загрузкой ячеек (поэтому я просто оставляю tableView пустым, а затем загружаю ячейки), тогда это работает :) - person beginner_T; 06.10.2016