如何知道tableview中的哪个单元格已被选中

时间:2015-05-25 21:41:38

标签: uitableview swift tableview

我有一个包含tableview的视图控制器,这个tableview包含在storyboard中完成的动态单元格。大多数单元格包含一个文本字段,在视图控制器中,我需要检测文本字段何时被选中以及它是哪个单元格。 (我加载一个指向单元格的弹出窗口,必须从视图控制器调用它。)

单元格代码

import UIKit

class AddNew_Date_Cell: UITableViewCell {

    @IBOutlet var Label: UILabel!
    @IBOutlet var textField: UITextField!

    func loadItem(var data:NSArray) {
        Label.text = data[0] as? String
    }
}

ViewControllerCode

import UIKit

class AddNewDetailView: UIViewController, UITableViewDelegate, UITableViewDataSource, UIPopoverPresentationControllerDelegate, UITextFieldDelegate {


   @IBOutlet var tableView: UITableView!

    var items : NSMutableArray!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
       return UITableViewAutomaticDimension
    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        switch(items[indexPath.row][1] as! Int)
        {
             ...

             case 2:
             var cell:AddNew_Date_Cell = tableView.dequeueReusableCellWithIdentifier("AN_Date_Cell") as! AddNew_Date_Cell
             cell.loadItem(items[indexPath.row] as! NSArray, view: self)
             cell.textField.delegate = self
             return cell

              ...
         }
     }

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

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        //Need to know here which cell the textfield is attached to
        turn true
    }
}

每次我选择一个文本区域视图时,我都会在" textFieldShouldBeginEditing"中找到一个断点。但是我不知道它在哪个细胞中。

如果我选择单元格中的文本字段" didSelectRowAtIndexPath"永远不会被击中。

如何找出已选择的单元格。

由于

3 个答案:

答案 0 :(得分:0)

您需要在未编辑文本字段时设置用户关闭,在cellForRowAtIndexPath中添加此行

cell.textField.userInteractionEnabled = false

在didSelectRowAtIndexPath中,你需要再次启用版本,否则用户不想触摸它,如果他们想要并呼叫第一响应者:

cell.textField.userInteractionEnabled = true
cell.textField.becomeFirstResponder()

用户在textFieldShouldEndEditing中完成编辑后再次禁用交互:

cell.textField.userInteractionEnabled = false

这样将始终调用cellForRowAtIndexPath,但由您决定是否设置用户使用正确的UITextField。

我希望能帮到你

答案 1 :(得分:0)

您可以使用带有委托协议的自定义单元格类,让您知道文本字段何时开始编辑。

自定义单元格将是文本字段的委托,视图控制器将是自定义单元格的委托。

对于一个基本示例,您的单元格类可能如下所示:

import UIKit

protocol TextFieldCellDelegate {
    func textFieldCellDidBeginEditing(cell: TextFieldCell)
}

class TextFieldCell: UITableViewCell {

    @IBOutlet weak var textField: UITextField!
    var delegate: TextFieldCellDelegate?
}

extension TextFieldCell: UITextFieldDelegate {
    func textFieldDidBeginEditing(textField: UITextField) {
        delegate?.textFieldCellDidBeginEditing(self)
    }
}

您的视图控制器将实现如下方法:

extension ViewController: TextFieldCellDelegate {
    func textFieldCellDidBeginEditing(cell: TextFieldCell) {
        println(cell)
        // Do something with cell
    }
}

答案 2 :(得分:0)

如果你想找出你的单元格的索引,请在func textFieldShouldBeginEditing(textField:UITextField)中写下面的代码

    var index = 0
    var position: CGPoint = textField.convertPoint(CGPointZero, toView: self.<your_table_outlet_name>)
    if let indexPath = self.<your_table_outlet_name>.indexPathForRowAtPoint(position)
    {
        index = indexPath.row
    }