从 UITableViewCell 中点击 Swift 更改标签文本颜色

Posted

技术标签:

【中文标题】从 UITableViewCell 中点击 Swift 更改标签文本颜色【英文标题】:Swift Change label text color on tap from within TableViewCell 【发布时间】:2018-01-30 05:01:19 【问题描述】:

我有一个UILabelTableView 内,我想在用户点击时将 UILabel 的颜色更改为红色。我正在使用UITapGestureRecognizer,在点击UILabel 时,我可以获得UILabel 的内容,但我无法获得实际的UILabel,因为据我所知,UIGesture 中不能有参数功能。

这是我的代码,它可以帮助你搞清楚

class HomeProfilePlacesCell: NSObject 

    var Post =  [String]()

    @objc func PostTap(_ sender: UIGestureRecognizer) 
        print(Post[(sender.view?.tag)!])
    

    func HomeProfilePlaceTVC(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, streamsModel : streamModel,HOMEPROFILE: HomeProfile, controller: UIViewController) -> UITableViewCell 

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

         let tapGesture = UITapGestureRecognizer(target: self, action: #selector(PostTap(_:)))
         tapGesture.delegate = self as? UIGestureRecognizerDelegate
         cell.post.addGestureRecognizer(tapGesture)

         cell.post.text = streamsModel.Posts[indexPath.row]
         cell.post.tag = indexPath.row
         Post = streamsModel.Posts

         return cell 
    

我的功能是 PostTap 每当用户点击UILabel 这是 cell.post 然后我可以在 PostTap 中阅读它的内容> 但是为了改变 UILabel 的颜色,我必须将 let cell 常量传递给 PostTap 函数。

无论如何我可以做到这一点或解决方法吗?我是 Swift 新手

【问题讨论】:

使用代表:***.com/questions/39585638/… 在你的情况下:call.delegate = controller 试试这个@objc func PostTap(_ sender: UIGestureRecognizer) sender.view?.backgroundColor = .red 【参考方案1】:

使用 TableView 代理:[SWIFT 4.0]

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

    let cell = tableView.cellForRowAtIndexPath(indexPath) as! <your Custom Cell>
    cell.<your CustomCell label name>.textColor = UIColor.red
    //OR
    cell.<your Customcell label name>.backgroundColor = UIColor.green
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)


func tableView(tableView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) 

    let cell = tableView.cellForRowAtIndexPath(indexPath) as! <your Custom Cell>

    // change color back to whatever it was
    cell.<your Customcell label name>.textColor = UIColor.black
    //OR
    cell.<your Customcell label name>.backgroundColor = UIColor.white
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)

【讨论】:

【参考方案2】:

将标签添加到单元格为 indexPath.row

cell.tag = indexPath.row

然后

@objc func PostTap(_ sender: UIGestureRecognizer) 
     let cell = self.tableVIew.cellForRow(at: sender.tag) as! HomeTVC
      // Now you access your cell label here, and can do whatever you want


【讨论】:

这很脆弱,如果 tableview 允许行重新排序(或行插入/删除)会破坏 这个方法会在你点击它时被调用。行重新排序不会破坏它 假设屏幕上有 5 个单元格,它们的标签是 0-4。现在我删除第 3 行的单元格,从而显示一个新单元格来填补空白。我现在在屏幕上有带有以下标签的单元格; 0,1,2,4,5,5。您可以专门重置 didMove... 方法中的标签来处理我猜的这种情况。 行删除后,您必须重新加载表视图。重新加载tableview时,再次调用cell for row,标签会自动重置。 但这会导致视觉体验不佳,并且在重新加载整个 tableview 时会进行不必要的工作。相信我,总有比使用标签更好的解决方案。例如,如果您的 tableview 有部分怎么办?标签以多种方式中断。【参考方案3】:

你可以通过使用来实现它

 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath)

当用户点击单元格时,此方法调用 在这个方法中这样做

tableView.cellForRow(at: indexPath)

这将使您将单元格转换为您的单元格类 现在你可以在那个单元格中用你的标签做任何事情 单元格.标签....

【讨论】:

【参考方案4】:

要更改点击索引标签的颜色,首先需要在变量上声明以识别点击位置

var selectedCellIndex = "" // initialize as empty string

在你的 cellForRowAt

 func HomeProfilePlaceTVC(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, streamsModel : streamModel,HOMEPROFILE: HomeProfile, controller: UIViewController) -> UITableViewCell 

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



         cell.post.text = streamsModel.Posts[indexPath.row]
         cell.post.tag = indexPath.row
         cell.post.isUserInteractionEnabled = true

          let tapGesture = UITapGestureRecognizer(target: self, action: #selector(PostTap(_:)))
         tapGesture.delegate = self as? UIGestureRecognizerDelegate
         cell.post.addGestureRecognizer(tapGesture)
         Post = streamsModel.Posts

         if self.selectedCellIndex == "\(indexPath.row)" 
            cell.post.text = UIColor.red
          else 
            cell.post.text = UIColor.blue
         

         return cell 
    

在您的点按功能中

func PostTap(_ sender:UIGestureRecognizer)
    let tapView = gesture.view!
    let index = tapView.tag
    self. selectedCellIndex = "\(index)"
    self.YOUR_TABLE_NAME.reloadData()
 

希望对你有帮助

【讨论】:

【参考方案5】:

在 Cell 中尝试Closure 方法

在自定义表格视图单元格中:

class HomeTVC: UITableViewCell 

    @IBOutlet weak var labelPost: UILabel!

    var callBackOnLabelTap: (()->())?

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(postTap(_:)))
        tapGesture.numberOfTapsRequired = 1
        tapGesture.delegate = self
        self.labelPost.addGestureRecognizer(tapGesture)
    

    @objc func postTap(_ sender: UIGestureRecognizer) 
        self.callBackOnLabelTap?()
    

    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    

然后在cellForRowAt indexPath

func HomeProfilePlaceTVC(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, streamsModel : streamModel,HOMEPROFILE: HomeProfile, controller: UIViewController) -> UITableViewCell 

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

     cell.callBackOnLabelTap = 
        cell.labelPost.backgroundColor = UIColor.black
    

     return cell 

【讨论】:

【参考方案6】:

对我来说,我希望在点击标签的容器单元格时改变标签的颜色。 您可以为标签文本选择您想要的颜色,点击时选择标签的突出显示(在属性检查器中)。从下拉列表中,您可以选择点击单元格时想要看到的颜色。

属性检查器:标签的突出显示属性

【讨论】:

以上是关于从 UITableViewCell 中点击 Swift 更改标签文本颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UITableViewCell 中获取价值

如何从 swift 中的按钮选项中删除 uitableviewcell?

通过点击单元格内的图像从 UITableViewCell 中分离

我想从数组中 UITableviewCell 的文本字段中添加字符串

如何将触摸从 UITextView 传递到 UITableViewCell

从 UITableViewCell 隐藏删除按钮