iOS swift UIImageView изменить изображение в ячейке tableView

У меня странная проблема в tableView Custom cell. для подобного действия с изображением я пишу этот код в Custom cell под названием FeedViewCell:

self.like.isUserInteractionEnabled = true
let CommenttapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(likehandleTap))
self.like.addGestureRecognizer(CommenttapGestureRecognizer)

func likehandleTap(_ sender: UITapGestureRecognizer) {

    if self.like.image == UIImage(named: "like-btn-inactive") {

        self.like.image = UIImage(named: "like-btn-active")

    } else {
        self.like.image = UIImage(named: "like-btn-inactive")
    }
}

и TableViewController:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "FeedCell", for: indexPath) as! FeedViewCell

    return cell
}

но, как вы видите в это видео, когда я касаюсь кнопки Like в индексе 0 и меняю изображение, кнопка Like в индексе 3 также меняет изображение. подскажите, пожалуйста, мою ошибку?

Благодарность


person Mohammadreza    schedule 15.10.2016    source источник
comment
У вас должна быть кнопка взять и дать ей изображение. Вы можете легко управлять этой вещью с помощью кнопки. Если хочешь ответа, я отправлю   -  person Jitendra Modi    schedule 15.10.2016
comment
дорогой @Jecky проблема все еще существует с кнопкой, ничего не изменилось   -  person Mohammadreza    schedule 15.10.2016
comment
Я отправлю свой ответ, просто попробуй   -  person Jitendra Modi    schedule 15.10.2016
comment
У меня та же проблема: stackoverflow.com/questions/40049590/   -  person Carlo    schedule 15.10.2016
comment
да. Разница только в том, что у меня есть кнопка, а у вас изображение. Это что-то о повторном использовании ячеек.   -  person Carlo    schedule 15.10.2016
comment
dropbox.com/s/zedbmuqsmynx5zn/Untitled.mov?dl=0 @MohammadReza Тебе это нравится?   -  person Jitendra Modi    schedule 15.10.2016
comment
Хорошо, я отправлю свой ответ   -  person Jitendra Modi    schedule 15.10.2016
comment
Ячейки используются повторно, поэтому вы не можете полагаться на ячейку для хранения состояния. Вам нужно где-то сохранить понравившееся / не понравившееся состояние в вашей модели данных, а затем использовать его в cellForRowAtIndexPath и в обработчике кнопок; вы также должны использовать делегирование или закрытие, чтобы позволить контроллеру tableview обрабатывать касание, а не иметь логику в ячейке   -  person Paulw11    schedule 15.10.2016
comment
@ Paulw11, вы можете помочь мне с кодом и в моем вопросе, пожалуйста? stackoverflow.com/questions/ 40049590 /   -  person Carlo    schedule 15.10.2016
comment
@ Джеки, да, я хочу что-то в этом роде. Благодарность   -  person Mohammadreza    schedule 15.10.2016
comment
@MohammadReza проверьте мой ответ   -  person Jitendra Modi    schedule 15.10.2016
comment
@MohammadReza получил ответ?   -  person Himanshu Moradiya    schedule 15.10.2016
comment
@HimanshuMoradiya нет проблема все еще существует :(   -  person Mohammadreza    schedule 15.10.2016
comment
@MohammadReza попробуйте Jecky, отлично ответьте на его работу, я пробую, и я получил результат, поэтому вы также попробуйте.   -  person Himanshu Moradiya    schedule 15.10.2016


Ответы (3)


Попробуйте код, он работает на 100%

  var selectindex : Int?
  var selectedindex : NSMutableArray = NSMutableArray()
  @IBOutlet var tableview: UITableView!

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("LikeCell", forIndexPath: indexPath)

        let like: UIButton = (cell.viewWithTag(2) as! UIButton)
        let comment: UIButton = (cell.viewWithTag(3) as! UIButton)
        if selectedindex.containsObject(indexPath.row) {
                like.setBackgroundImage(UIImage.init(named: "like.png"), forState: .Normal)
        }else{
                like.setBackgroundImage(UIImage.init(named: "like (1).png"), forState: .Normal)
        }
       comment.setBackgroundImage(UIImage(named: "chat.png"), forState: UIControlState.Normal)
        like.addTarget(self, action: #selector(self.CloseMethod(_:event:)), forControlEvents: .TouchDown)
        comment.addTarget(self, action: #selector(self.CloseMethod1(_:event:)), forControlEvents: .TouchDown)

        return cell

    }



 @IBAction func CloseMethod(sender: UIButton, event: AnyObject) {

        let touches = event.allTouches()!
        let touch = touches.first!
        let currentTouchPosition = touch.locationInView(self.tableview)
        let indexPath = self.tableview.indexPathForRowAtPoint(currentTouchPosition)!
        selectindex = indexPath.row
        if selectedindex.containsObject(selectindex!) {
            selectedindex.removeObject(selectindex!)
        }else{
              selectedindex.addObject(selectindex!)
        }
        self.tableview.reloadData()
    }
person Himanshu Moradiya    schedule 15.10.2016
comment
прямо сейчас я создаю одну демонстрацию, так как же возможно, что вы попробуете мой код? - person Himanshu Moradiya; 15.10.2016
comment
ты прислал мне вчера, помнишь? но я пробую этот код сейчас, и новая проблема (переход в табличное представление) все еще существует - person Mohammadreza; 15.10.2016
comment
Нет, сейчас он работает на моем компьютере, и у меня нет никаких проблем. пришлите мне весь свой проект, я внес изменения в этот код и запустил этот проект на моем компьютере, и я снова отправлю его вам - person Himanshu Moradiya; 15.10.2016
comment
@MohammadReza, у тебя есть мой электронный адрес? так отправь это - person Himanshu Moradiya; 15.10.2016
comment
это произошло (прыжок в виде таблицы), потому что UITableViewAutomaticDimension - person Mohammadreza; 15.10.2016
comment
Вы смотрели мое видео, которое я комментирую выше? а почему вы используете анимацию UITableViewAutomaticDimension? - person Himanshu Moradiya; 15.10.2016
comment
да, я смотрел, ваш код работает нормально, за исключением проблемы с переходом в tableView, я использую UITableViewAutomaticDimension, потому что высота моей ячейки не статическая, и она изменяется в зависимости от высоты содержимого - person Mohammadreza; 15.10.2016
comment
@MohammadReza попробуйте один раз просто прокомментировать эту строку и запустить свой проект с моим кодом, проверить его и одобрить мой ответ, брат. - person Himanshu Moradiya; 15.10.2016

Вот почему вы меняете изображение, загруженное в imageView, а затем методом tableView.dequeueReusableCell повторно используете эту ячейку с измененным изображением.

В iOS UITableView и UICollectionView применяется концепция многоразовых ячеек. Они не создают по одной ячейке для каждого элемента массива; они просто создают 3-4 ячейки, а затем повторно используют их, просто меняя содержимое внутри. Это отличная вещь, потому что она позволяет разработчикам создавать таблицы с сотнями строк без проблем с памятью.

Это шаги, за которыми следует tableView (а также collectionView), чтобы показать массив элементов:

  1. prepareForReuse
  2. cellForRowAtIndexPath
  3. willDisplayCell

Чтобы решить вашу проблему, вам нужно просто проверить подобное в cellForRowAtIndexPath

Пример:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "FeedCell", for: indexPath) as! FeedViewCell

    let model = arrayOfElements[indexPath.row]
    if model.isLiked {
        cell.like.image == UIImage(named: "like-btn-active")
    } else {
        cell.like.image == UIImage(named: "like-btn-active")
    }

    return cell
}
person Andrea Antonioni    schedule 15.10.2016

Возьмите один массив

let arr : NSMutableArray = NSMutableArray()

И в tableview возьмите кнопку вместо изображения и установите в отличие от изображения в кнопке и установите свои изображения вместо моих изображений

 func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

        let btn = cell.viewWithTag(10) as! UIButton
        btn.addTarget(self, action: #selector(ViewController.connected(_:)), forControlEvents: .TouchUpInside)
        return cell
    }

    func connected(sender: UIButton){
        let buttonposition = sender.convertPoint(CGPointZero, toView: self.tblview)
        let index = self.tblview.indexPathForRowAtPoint(buttonposition)

        if !arr.containsObject((index?.row)!) {
            arr.addObject((index?.row)!)
            sender.setImage(UIImage(named: "ic_check.png"), forState: .Normal)
        }else
        {
            arr.removeObject((index?.row)!)
            sender.setImage(UIImage(named: "ic_uncheck.png"), forState: .Normal)
        }

    }
person Jitendra Modi    schedule 15.10.2016
comment
IndexSet - лучшая структура, чем массив для этой задачи - person Paulw11; 15.10.2016
comment
Кроме того, вы должны использовать делегат или закрытие, чтобы получить действие из ячейки, а не устанавливать обработчик действий между классами - stackoverflow.com / questions / 28659845 / - person Paulw11; 15.10.2016
comment
Да, я могу это сделать. Спасибо, попробую @ Paulw11 - person Jitendra Modi; 15.10.2016
comment
@MohammadReza Загрузите демо отсюда dropbox.com/ s / 4d3dva6rxsic6u6 / Demo% 20in% 20Swift% 202.0.zip? dl = 0 - person Jitendra Modi; 15.10.2016
comment
@MohammadReza Понял или нет? - person Jitendra Modi; 15.10.2016
comment
@Jecky да, спасибо, но у вашего кода есть проблема, как у моего кода !! см. здесь: dl.dropboxusercontent.com / u / 8744173 / - person Mohammadreza; 15.10.2016
comment
@ Джеки, ты знаешь, почему на моем симуляторе так работает? - person Mohammadreza; 15.10.2016