Изменение значения в прокрутке UITableView

У меня есть UITableView с кнопкой в ​​том, что переключается в зависимости от того, является ли пользователь фаворитом сообщение или нет. Все работает хорошо, за исключением того, что при просмотре табличного представления кнопка изменяется. Здесь мой код:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let feed = self.feed else {
        return 0
    }
    return feed.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if feed!.count > 9 {
        if indexPath.row == feed!.count - 1 {
            self.loadMorePosts()
        }
    }

    if hasImageAtIndexPath(indexPath) {
        return imageCellAtIndexPath(indexPath)

    } else {
        return basicCellAtIndexPath(indexPath)
    }

}

func hasImageAtIndexPath(indexPath:NSIndexPath) -> Bool {
    let post = self.feed?[indexPath.row]

    if post?.image?.isEmpty == false {
        return true
    }

    return false
}

func imageCellAtIndexPath(indexPath:NSIndexPath) -> PostCellImage {
    let cell:PostCellImage = self.tableView.dequeueReusableCellWithIdentifier("imageCell", forIndexPath: indexPath) as! PostCellImage


    if let post = self.feed?[indexPath.row] {
        let likedPost = post.hasFavorited

        if likedPost == true {
            if let favoriteCount = post.favoriteCount {
                let count = String(favoriteCount)
                cell.likeButton.setTitle(count, forState: .Normal)
                cell.likeButton.setImage(UIImage(named: "liked"), forState: .Normal)
                cell.likeButton.setTitleColor(UIColorFromRGB("A61224"), forState: .Normal)
                cell.likeButton.addTarget(self, action: "unfavoritePost:", forControlEvents: UIControlEvents.TouchUpInside)
                cell.likeButton.tag = post.id!
            }
        } else {
            if let favoriteCount = post.favoriteCount {
                let count = String(favoriteCount)
                cell.likeButton.setTitle(count, forState: .Normal)
                cell.likeButton.addTarget(self, action: "favoritePost:", forControlEvents: UIControlEvents.TouchUpInside)
                cell.likeButton.tag = post.id!
            }
        }
    }

    return cell
}

Избранные сообщения Array

var favoritedPosts =  [Int]()

Просмотр таблицы

if let likedPost = post.hasFavorited {
    if likedPost == true {
        self.favoritedPosts.append(indexPath.row)             
        print(self.favoritedPosts)
    }
}

if self.favoritedPosts.contains(indexPath.row) {
    let count = String(post.favoriteCount)
    cell.likeButton.setTitle(count, forState: .Normal)
    cell.likeButton.setImage(UIImage(named: "liked"), forState: .Normal)
    cell.likeButton.setTitleColor(UIColorFromRGB("A61224"), forState: .Normal)
    cell.likeButton.addTarget(self, action: "unfavoritePost:", forControlEvents: UIControlEvents.TouchUpInside)
    cell.likeButton.tag = post.id!     
} else {
    let count = String(post.favoriteCount)
    cell.likeButton.setTitle(count, forState: .Normal)
    cell.likeButton.addTarget(self, action: "favoritePost:", forControlEvents: UIControlEvents.TouchUpInside)
    cell.likeButton.tag = post.id!        
}  

Ответ 1

В вашем подклассе UITableViewCell PostCellImage вы должны переопределить функцию prepeareForReuse - для переключения ячейки в режим по умолчанию.

Swift:

override func prepareForReuse() {
    super.prepareForReuse()

    //set cell to initial state here 
    //set like button to initial state - title, font, color, etc.
}

Ответ 2

Это может быть обведено повторным использованием ячейки таблицы. Оказывается, ваш код задает likeButton.image, когда сообщение является фаворитом, но не удаляет изображение, когда сообщение не является предпочтительным. Поэтому, когда в первый раз каждая ячейка загружается в tableView, каждая вещь работает нормально. Однако при прокрутке таблицыView, когда эти ячейки с избранным набором изображений перемещаются из области экрана, они будут повторно использоваться для прокрутки ячейки. Таким образом, если этот вид ячейки повторно используется сообщением, которое даже не используется, изображение все еще будет там.

Существует метод readyForReuse для UITableViewCell, он дает возможность reset содержимому до повторного использования ячейки.

Ответ 3

Вы можете попробовать prepareForReuse или попытаться установить непохожий образ в случае likedPost == false

Ответ 4

  • Вам нужно полностью reset внешний вид для нормального случая.
  • Причина в том, что вы не можете быть уверены, какое состояние кнопки вы получите, когда ячейки повторно используются.
  • Когда вы получаете выделенную ячейку, она может иметь с статусом "понравилось" / "не понравилось".
  • Завершение внешнего вида двумя прокомментированными строками в предложении else позволит решить вашу проблему.

     if self.favoritedPosts.contains(indexPath.row) {
        let count = String(post.favoriteCount)
        cell.likeButton.setTitle(count, forState: .Normal)
        cell.likeButton.setImage(UIImage(named: "liked"), forState: .Normal)
        cell.likeButton.setTitleColor(UIColorFromRGB("A61224"), forState: .Normal)
        cell.likeButton.addTarget(self, action: "unfavoritePost:", forControlEvents: UIControlEvents.TouchUpInside)
        cell.likeButton.tag = post.id!
    } else {
        let count = String(post.favoriteCount)
        cell.likeButton.setTitle(count, forState: .Normal)
    
        // Uncomment these two lines and add proper values for image / color to resolve your problem
        // cell.likeButton.setImage(UIImage(named: "not-liked-yet"), forState: .Normal)
        // cell.likeButton.setTitleColor(UIColorFromRGB("A67832"), forState: .Normal)
    
        cell.likeButton.addTarget(self, action: "favoritePost:", forControlEvents: UIControlEvents.TouchUpInside)
        cell.likeButton.tag = post.id!        
    }
    

Надеюсь, что это поможет.