想要在单击相同的 UIButton 时从 UITableViewCell 更改正确的 UIButton 图像

Posted

技术标签:

【中文标题】想要在单击相同的 UIButton 时从 UITableViewCell 更改正确的 UIButton 图像【英文标题】:Want to change a correct UIButton image from UITableViewCell on click same UIButton 【发布时间】:2018-02-20 06:29:54 【问题描述】:

我在 UITableViewCell 中有 UIButton。当我单击 UITableViewCell 中的 UIButton 时,多个 UIButtons 图像正在发生变化。假设,由于 Json Data 显示了 10 个 UIButton。接下来我将点击 UITableViewCell 中的 UIButton。结果在 UIButton 1、3、5、7、9 中改变了图像。但它应该改变一个 UIButton 图像。请帮我发布代码。我只想在单击 UIButton 时从 UITableViewCell 更改特定的 UIButton 图像

TableViewController

import UIKit

class HomeViewController2: UIViewController, UITableViewDelegate,UITableViewDataSource 

    @IBOutlet weak var homeTableView: UITableView!

    let arrNewsList = [[Home]]()

    override func viewDidLoad() 
        super.viewDidLoad()

        self.homeTableView.delegate = self
        self.homeTableView.dataSource = self
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return arrNewsList.count
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return arrNewsList[section].count
    

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

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

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

    return self.view.frame.size.height



TableViewCell

class HomeTableViewCell2: UITableViewCell 

    @IBOutlet weak var bookMarkBtn: UIButton!

    override func awakeFromNib() 
        super.awakeFromNib()

    

    @IBAction func bookMarkBtnClick(_ sender: Any) 

        guard let btnCheck = sender as? UIButton else 
            return
        

        btnCheck.setImage(UIImage(named: "favorite_blue"), for: UIControlState.normal)
    

【问题讨论】:

你得到了什么结果? 您是否为您的 json 响应创建了任何模型类对象?你能分享你的示例 json 吗? 这是出列可重用单元内存引起的问题,反映了这一点。 @NilomiShah 尝试帮助我 在您的自定义单元格中,尝试添加 prepareForReuse() 并将按钮变量设置为 nil 【参考方案1】:

这是一个问题,因为您的 TableView Cell 按钮正在重用内存。

我曾经遇到过这样的问题,你可以做的是维护一个数组。

获取与数组中相同数量的元素,用于显示表格中的项目

例如:

var arrayButton = [Int]
    for elements in mainArray 
       arrayButton.append(0)
    

现在你的数组已经准备好了,

当按钮状态改变时改变它的值, 0 = 禁用 1:选择

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

  let cell = tableView.dequeueReusableCell(withIdentifier: "HomeTableViewCell2", for: indexPath) as! HomeTableViewCell2
  cell.bookMarkBtn.addTarget(self, action: #selector(bookMarkBtnClick(sender:)), for: .touchUpInside)

    if(arrayButton[indexPath.row] == 1) 
          cell.bookMarkBtn.setImage(UIImage(named: "set_selected_image"), for: UIControlState.normal)
       
     else 
         cell.bookMarkBtn.setImage(UIImage(named: "set_unselected_image"), for: UIControlState.normal)
     
     cell.bookMarkBtn.tag = indexPath.row
     return cell
  




  func bookMarkBtnClick(sender: UIButton) 
        if(arrayButton[sender.tag] == 1)
            arrayButton[sender.tag] = 0
            sender.setImage(UIImage(named: "set_unselected_image"), for: UIControlState.normal)
         
          else 
               arrayButton[sender.tag] = 1 
               sender.setImage(UIImage(named: "set_selected_image"), for: UIControlState.normal)


【讨论】:

@objc func bookMarkBtnClick(sender: UIButton) if(arrayButton[sender.tag] == 1) **i got error down line** // Use of unresolved identifier 'intIndexPath' arrayButton[intIndexPath] = 0 else arrayButton[sender.tag] = 1 使用未解析的标识符 intIndexPath arrayButton[intIndexPath] = 0 现在看@EmmaAni 我忘记改了,抱歉,现在检查 朋友!按钮的图像没有改变【参考方案2】:

不要在你的单元格类中采取按钮操作,而是采取一个出口。并在 cellForRowAt 中添加操作。

类似这样的:

class HomeTableViewCell2: UITableViewCell 

    @IBOutlet weak var bookMarkBtn: UIButton!

     override func awakeFromNib() 
         super.awakeFromNib()

     
 

在 cellForRowAt 中:

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

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

    cell.bookMarkBtn.tag = indexPath.row
    cell.bookMarkBtn.addTarget(self, action: #selector(bookMarkBtnClick(sender:)), for: .touchUpInside)

    return cell

仅在您的 ViewController 中执行此功能:

func bookMarkBtnClick(sender: UIButton) 
   sender.setImage(UIImage(named: "favorite_blue"), for: UIControlState.normal)


【讨论】:

对不起,我没有意识到 请尝试在您的答案中添加一些代码,谢谢 你能展示你做了什么吗?因为同样的事情对我有用?如果您单击一个按钮,该按钮的图像应该会改变吗? 问题和以前一样 然后使用@NilomiShah 的想法,这是一种选择。

以上是关于想要在单击相同的 UIButton 时从 UITableViewCell 更改正确的 UIButton 图像的主要内容,如果未能解决你的问题,请参考以下文章

在Angular 4中单击时从相同的兄弟组件更改属性

尝试更新 UIButton 的标题以响应被选中

单击时从数据库中更改图片?

多按钮的相同子视图,多视图

单击 uibutton 时关闭弹出窗口

在辅助viewcontroller上显示来自网站的pdf