如何使用button标签快速访问自定义单元格的内容?

我有一个自定义单元格中有一个自定义button的应用程序。 如果你select了单元格,它会跳转到一个细节视图,这是完美的。 如果我在单元格中select一个button,下面的代码将把单元格索引打印到控制台中。

我需要访问所选单元格的内容(使用button),并将它们添加到数组或字典中。 我是新来的,所以很难find如何访问单元格的内容。 我尝试使用didselectrowatindexpath,但我不知道如何强制索引是标记的…

所以基本上,如果在每个单元格中有3个单元格,“Dog”,“Cat”,“Bird”作为cell.repeatLabel.text,并且select行1和3(索引0和2)中的button,它应该将“狗”和“鸟”添加到数组/字典中。

// MARK: - Table View override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return postsCollection.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell // Configure the cell... var currentRepeat = postsCollection[indexPath.row] cell.repeatLabel?.text = currentRepeat.product cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat) cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton cell.checkButton.tag = indexPath.row; cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside) return cell } func selectItem(sender:UIButton){ println("Selected item in row \(sender.tag)") } 

scheme1.使用委托进行处理

处理你单元格子视图的事件的正确方法是使用委托

所以你可以按照下面的步骤:

1.在你的类定义之上,在你的自定义单元格内用一个实例方法编写一个协议:

 protocol CustomCellDelegate { func cellButtonTapped(cell: CustomCell) } 

2.在你的类定义中声明一个委托variables并在委托上调用协议方法:

 var delegate: CustomCellDelegate? @IBAction func buttonTapped(sender: AnyObject) { delegate?.cellButtonTapped(self) } 

3.符合表视图所在类中的CustomCellDelegate:

  class ViewController: CustomCellDelegate 

4.设置你的单元格的委托

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell cell.delegate = self return cell } 

5.在您的视图控制器类中实现所需的方法。

编辑:首先定义一个空的数组,然后像这样修改它:

 private var selectedItems = [String]() func cellButtonTapped(cell: CustomCell) { let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)! let selectedItem = items[indexPath.row] if let selectedItemIndex = find(selectedItems, selectedItem) { selectedItems.removeAtIndex(selectedItemIndex) } else { selectedItems.append(selectedItem) } } 

其中items是在我的视图控制器中定义的数组:

 private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"] 

选项2.使用闭包处理它

我决定回来,向你展示处理这种情况的另一种方式。 在这种情况下使用闭包将导致更less的代码,你会实现你的目标。

1.在你的单元类中声明一个闭包variables:

 var tapped: ((CustomCell) -> Void)? 

2.调用button处理程序中的闭包。

 @IBAction func buttonTapped(sender: AnyObject) { tapped?(self) } 

3.在包含视图控制器类的tableView(_:cellForRowAtIndexPath:)中:

 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.tapped = { [unowned self] (selectedCell) -> Void in let path = tableView.indexPathForRowAtPoint(selectedCell.center)! let selectedItem = self.items[path.row] println("the selected item is \(selectedItem)") } 

由于你在表格视图中有1个部分,你可以得到如下的单元格对象。

 let indexPath = NSIndexPath(forRow: tag, inSection: 0) let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell! 

哪里标签你会从button标签。

Swift 3我只是在button标签的超级视图@IBAction函数获取访问单元的解决scheme。

 let cell = sender.superview?.superview as! ProductCell var intQty = Int(cell.txtQty.text!); intQty = intQty! + 1 let strQty = String(describing: intQty!); cell.txtQty.text = strQty 
 @IBAction func buttonTap(sender: UIButton) { let button = sender as UIButton let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)! } 

我更新了Swift 3的 Vasil Garov的答案选项1

1.为您的CustomCell创build一个协议:

 protocol CustomCellDelegate { func cellButtonTapped(cell: CustomCell) } 

2.为你的TableViewCell声明一个delegatevariables,并调用它的协议方法:

 var delegate: CustomCellDelegate? @IBAction func buttonTapped(sender: AnyObject) { delegate?.cellButtonTapped(self) } 

3.符合你的tableView类中的CustomCellDelegate

  class ViewController: CustomCellDelegate 

4.设置你的单元格的delegate

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as CustomCell cell.delegate = self return cell } 

5.在您的ViewController实现所需的方法。

基于曹的回答,这里是一个解决scheme来处理集合视图单元格中的button。

  @IBAction func actionButton(sender: UIButton) { let point = collectionView.convertPoint(sender.center, fromView: sender.superview) let indexPath = collectionView.indexPathForItemAtPoint(point) } 

请注意,convertPoint()函数调用将转换集合视图空间中的button点坐标。 没有 ,indexPath将始终引用相同的单元号0

XCODE 8:重要提示

不要忘记将标签设置为不同于0的值。

如果你尝试使用tag = 0来转换对象,它可能会工作,但在一些奇怪的情况下,它不会。

解决办法是将标签设置为不同的值。 希望它可以帮助别人。