处理触摸事件到一个UITableCell

时间:2016-04-12 07:52:00

标签: ios swift uitableview uigesturerecognizer becomefirstresponder

我有一些UITableViewCells,我可以在其中执行点击操作。

当点击操作开始时,单元格将展开,并显示UIPickerView,UITextView或其他数据。 (见示例图片)

再次单击TableCell时,单元格将折叠,并显示原始状态。

当我使用展开操作单击UITableViewCell时,当前每个单元格都会展开。当我单击一个单元格时,我希望每个其他单元格都被折叠,只展开所单击的单元格。

问题:

如何为扩展的表格单元格提供接收所有触摸事件的状态单元格。 (成为整个屏幕的第一个响应者)并先关闭它,然后在关闭操作后将click事件发送到相应的UITableViewCell。

我已经让UITextView成为第一个响应者,它会在它加速后关闭键盘,但我希望表格单元格成为点击事件的处理程序。

示例代码

func togglePicker() {
    //This function is called when the UITableCell is clicked.

    canBecomeFirstResponder()

    // Some code here which adds UIPickerView, UITextView or other data.

    setNeedsLayout()
}

我尝试了这段代码,但是这个单元格只接收在这个单元格中触发但不在其边界之外的触摸事件。

示例图片

Orginal cell state

First cell is expanded

2 个答案:

答案 0 :(得分:1)

我实施了以下解决方案:

class CustomCell: UITableViewCell {

   var delegate: CustomCellDelegate?
   var focussed: Bool = false

   function becomeFocussed() {
      //Put some code here to change the design
      setNeedsLayout()
      focussed = true
      delegate?.isFocussed(self)
   }

   function becomeNormaleState() {
      //Put some code here to change the design to the original state.
      focussed = false
      setNeedsLayout()
   }

}

每个Cell都有两个函数:becomeFocussed()和becomeNormaleState()。单击单元格时,应调用函数becomeFocussed()。 此函数告诉代理该单元格已被选中。

在TableViewController中,函数isFocussed(cell:UITableViewCell),循环遍历当前tableView的调用单元格调用" becomeNormaleState()"对于每个聚焦的细胞。

答案 1 :(得分:0)

好的,通过查看你正在改变单元框架的图像,问题中你问的When I click on a cell I want every other cell to be collapsed and only expand the clicked one.的一个解决方案,你可以存储被点击单元格的索引路径并使用此折叠其他单元格如果显示该单元格的选择器视图,

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if showIndexPath?.row == indexPath.row 
    {
        return 330 //expanded height for example
    }
    else {
         return 100 //normal state height for example
    }
}

 //in this method u can decide which one to expand or collapse 
 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //if user selected the same cell again close it
    if showIndexPath?.row == indexPath.row 
    {
        //already expanded, collapse it 
        showIndexPath = nil
        tableView .reloadRowsAtIndexPaths([showIndexPath!], withRowAnimation: .Fade)

    }
    else
    {
        //expand this cell's index path 
        showIndexPath = indexPath
        tableView .reloadRowsAtIndexPaths([showIndexPath!], withRowAnimation: .Fade)
    }
}