iOS swift UIImageView更改tableView单元格中的图像
Posted
技术标签:
【中文标题】iOS swift UIImageView更改tableView单元格中的图像【英文标题】:iOS swift UIImageView change image in tableView cell 【发布时间】:2016-10-15 10:03:54 【问题描述】:我在tableView
自定义cell
中有一个奇怪的问题。对于像图像操作,我在自定义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
但是正如您在this 视频中看到的那样,当我触摸索引 0 中的点赞按钮并更改图像时,索引 3 中的点赞按钮也会更改图像。大家能告诉我我的错误吗?
谢谢
【问题讨论】:
你应该有拍摄按钮并给它图像。你可以用按钮轻松管理这个东西。如果你想回答,我会发帖 亲爱的@Jecky按钮问题仍然存在,没有任何改变 我会发布我的答案,试试吧 我也有同样的问题:***.com/questions/40049590/… 单元格被重复使用,因此您不能依赖单元格来存储状态。您需要将喜欢/不喜欢的状态存储在您的数据模型中的某个地方,然后在cellForRowAtIndexPath
和您的按钮处理程序中使用它;您还应该使用委托或闭包来允许 tableview 控制器处理点击,而不是在单元格中拥有逻辑
【参考方案1】:
尝试 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()
【讨论】:
dropbox.com/sh/d5gzw4ocqgprfj4/AAAdRCEFv1iToXxwbDGuerWta?dl=0 我昨天尝试了你的代码,但是我的代码有一个新问题,它发生在调用 tableView.reloadData 时。在这里观看视频:dl.dropboxusercontent.com/u/8744173/… 现在我创建了一个演示,所以你有可能尝试我的代码吗? 你昨天发给我的,记得吗?但我现在尝试这段代码,新问题(tableview 跳转)仍然存在 不,它现在在我的电脑上运行,我没有遇到任何问题。将您的整个项目发给我 【参考方案2】:这就是为什么您要更改在 imageView
中加载的图像,然后使用方法 tableView.dequeueReusableCell
您正在使用更改后的图像重新使用该单元格。
在 ios 中 UITableView
和 UICollectionView
应用可重复使用单元格的概念。他们不会为数组的每个元素创建一个单元格。他们只创建 3-4 个单元格,然后他们将重用它,只是更改里面的内容。这是一件很棒的事情,因为它允许开发人员创建包含数百行的表而不会出现内存问题。
这些是tableView
(以及collectionView
)所遵循的步骤来显示元素数组:
-
准备重用
cellForRowAtIndexPath
将DisplayCell
要解决您的问题,您只需检查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
【讨论】:
【参考方案3】:取一个数组
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)
【讨论】:
IndexSet
是比数组更好的结构
此外,您应该使用委托或闭包从单元格中获取操作,而不是在类之间设置操作处理程序 - ***.com/questions/28659845/…
是的,我能做到。谢谢你,我会试试@Paulw11
@MohammadReza 从这里下载演示 dropbox.com/s/4d3dva6rxsic6u6/Demo%20in%20Swift%202.0.zip?dl=0
@MohammadReza 知道吗?以上是关于iOS swift UIImageView更改tableView单元格中的图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅
无法更改 UITableViewCell 内 UIImageView 的宽度和高度 - swift