如何将视图 TableViewCell 转换为 UIGestureView

Posted

技术标签:

【中文标题】如何将视图 TableViewCell 转换为 UIGestureView【英文标题】:How to cast view TableViewCell to UIGestureView 【发布时间】:2018-02-16 01:28:30 【问题描述】:

我正在尝试在手势视图点击上更改我的表格视图单元格内容,但是我收到了错误

线程 1:信号 SIGABRT

无法将“UILabel”(0x117f4ad68) 类型的值转换为“MyApplication.Read”

func ReadAnswer(_ sender: UIGestureRecognizer)  
    let CellIndex = sender.view?.tag
    print(CellIndex!)
    let test = sender.view as! Read!  // This produces error

    test?.comment.text = "You have clicked on cell \(CellIndex)"


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let mycell = tableView.dequeueReusableCell(withIdentifier: "Read", for: indexPath) as! Read

    mycell.comment.tag = indexPath.row
    mycell.comment.text = streamsModel.Posts[indexPath.row]

    let Gesture = UITapGestureRecognizer(target: self, action: #selector(ReadAnswer(_:)))
    Gesture.delegate = self as? UIGestureRecognizerDelegate

    mycell.comment.addGestureRecognizer(Gesture)

    return cell

再次单击标签我想更改该标签的内容,以说明您已单击单元格 (CellIndex) 。我可以在每次点击时获得正确的索引,但是在 Let Test 上会出现错误。

【问题讨论】:

【参考方案1】:

你被添加到GestureUILabel..!! commentUILabel

let Gesture = UITapGestureRecognizer(target: self, action: #selector(ReadAnswer(_:)))
Gesture.delegate = self as? UIGestureRecognizerDelegate

mycell.comment.addGestureRecognizer(Gesture)

Gesture Action 中,sender.view 应该是 UILabel。所以发生了以下错误。

无法将“UILabel”(0x117f4ad68) 类型的值转换为“MyApplication.Read”

func ReadAnswer(_ sender: UIGestureRecognizer)  
    let CellIndex = sender.view?.tag
    print(CellIndex!)


    let test = sender.view as! Read!  // This produces error

    test?.comment.text = "You have clicked on cell \(CellIndex)"


解决

我们必须为此使用字典。因此,我们可以避免 tableView 重用。你可以得到我的answer UIStepper。同理如下。

var textDict = [Int : String]()
override func viewDidLoad() 
    super.viewDidLoad()

    for i in 0..<70 // numberOfRows
    
        textDict[i] = "Hello"
    

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return 70

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

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

    let Gesture = UITapGestureRecognizer(target: self, action: #selector(ReadAnswer))
    Gesture.delegate = self as? UIGestureRecognizerDelegate

    cell.commentLbl.tag = indexPath.row
    cell.commentLbl.isUserInteractionEnabled = true
    cell.commentLbl.addGestureRecognizer(Gesture)

    cell.commentLbl.text = textDict[indexPath.row]

    return cell


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

    return 50


@objc func ReadAnswer(_ sender: UIGestureRecognizer)  

    let CellIndex : Int = (sender.view?.tag)!

    textDict[CellIndex] = "You have clicked on cell \(CellIndex)"

    tblView.reloadData()


【讨论】:

【参考方案2】:

一些背景要点:不要在每次添加单元格时添加手势识别器。随着您的细胞被回收,您将获得越来越多的手势识别器。向您的自定义单元类添加一个标志,告知您是否已经添加了手势识别器,并且仅在您尚未添加时添加一个。

(不会阻止您的代码工作,但仍然很重要)。 Swift 中的方法名和变量名应该以小写字母开头。类和类型名称应以大写字母开头。

至于你的强制施法失败的原因,听起来你单元的mycell.comment 出口不是所需的类型Read。根据错误,它的类型为UILabel,而不是Read(不管是什么)。但是,您没有给我们足够的信息来帮助我们解决这部分问题。您需要说明您是如何设置我的班级的插座的,还需要说明Read 类型是什么。

【讨论】:

【参考方案3】:

在您的ReadAnswer 函数中,sender 引用了它所附加到的视图。该视图是您命名为commentUILabel

改变你的功能如下:

func ReadAnswer(_ sender: UIGestureRecognizer)  
    let CellIndex = sender.view?.tag
    print(CellIndex!)
    if let test = sender.view as? UILabel 

        test.comment.text = "You have clicked on cell \(CellIndex)"
    

【讨论】:

【参考方案4】:

这是我刚刚写的测试答案

我的数组

var staticArrayy = ["1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1"]

我的 tableview 委托

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

    //Setting cells data
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    
        let cell = self.myDemoTableView.dequeueReusableCell(withIdentifier: "Cell") as! CustomTableViewCell

        ///Adding Gesture
        let Gesture : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tableViewVC.ReadAnswer(_:)))
        Gesture.numberOfTapsRequired = 1
        Gesture.cancelsTouchesInView = false
        Gesture.delegate = self
        cell.comment.addGestureRecognizer(Gesture)

        cell.comment.isUserInteractionEnabled = true

        ///Assuming mycell.comment.text is a Label Connected
        cell.comment.text = staticArrayy[indexPath.row]

        return cell
    

//Setting height of cells
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
        
    return 60

点击手势处理程序

@objc func ReadAnswer(_ sender: UITapGestureRecognizer)
    
        //Get position in View
        let myPosition = sender.location(in: self.myDemoTableView)

        //Get current Index Path
        let indexPath : IndexPath = self.myDemoTableView.indexPathForRow(at: myPosition)!

        //Time to Show Answer
        var cell = self.myDemoTableView.dequeueReusableCell(withIdentifier: "Cell") as! CustomTableViewCell
        cell = self.myDemoTableView.cellForRow(at: indexPath) as! CustomTableViewCell
        cell.comment.text = "You have clicked on cell \(indexPath.row)"

        //Re-Deque issue
        //Update the Array Content at same Index whose value is changed
        self.staticArrayy[indexPath.row] = cell.comment.text!
    

我的细胞类

import UIKit

class CustomTableViewCell: UITableViewCell


    @IBOutlet weak var comment: UILabel!


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

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

        // Configure the view for the selected state
    


输出:

tableView 第一次加载时

当点击 TableView 单元格时

【讨论】:

你可以添加超过 30 个单元格并检查吗?是不是重用? 同样,你能解释一下吗,我最多可以添加 30 行接下来要做什么? 点击第 1 行,更改标签文本,然后滚动到底部,是否看到任何差异? 好的,我遇到了 Re-Deque 问题,解决了检查更新的答案,感谢您提供的信息,例如,我错过了这样做 现在,请检查我的答案。两者是相同的,

以上是关于如何将视图 TableViewCell 转换为 UIGestureView的主要内容,如果未能解决你的问题,请参考以下文章

如何将子视图添加到 TableViewCell?

如何在单个 TableViewcell 的不同部分有不同的图像,将集合视图放置在 tableviewCell 内

单击tableview标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器

滑动单元格时,有没有办法从 tableViewCell 导航到另一个视图控制器?

如何在部分中为特定行滑动 tableviewcell

如何更改视图控制器中的标签 我要加载一个 tableviewcell 被选中? [复制]