gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:12:43 25 4
gpt4 key购买 nike

我有一个应用程序在自定义单元格中有一个自定义按钮。如果您选择单元格,它会转到详细 View ,这是完美的。如果我在单元格中选择一个按钮,下面的代码会将单元格索引打印到控制台中。

我需要访问所选单元格的内容(使用按钮)并将它们添加到数组或字典中。我对此很陌生,所以很难找出如何访问单元格的内容。我尝试使用 didselectrowatindexpath,但我不知道如何强制索引成为标签的索引...

所以基本上,如果有 3 个单元格,每个单元格中的 cell.repeatLabel.text 为“狗”、“猫”、“鸟”,我选择第 1 行和第 3 行(索引 0 和 2)中的按钮, 它应该将 'Dog' 和 'Bird' 添加到数组/字典中。

    // 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)")

}

最佳答案

选项 1.通过委托(delegate)

处理它

处理从单元格 subview 触发的事件的正确方法是使用委托(delegate)

因此您可以按照以下步骤操作:

1. 在您的类定义之上,在您的自定义单元格中编写一个带有单个实例方法的协议(protocol):

protocol CustomCellDelegate {
func cellButtonTapped(cell: CustomCell)
}

2. 在您的类定义中声明一个委托(delegate)变量并在委托(delegate)上调用协议(protocol)方法:

var delegate: CustomCellDelegate?

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

3. 符合您的 TableView 所在类中的 CustomCellDelegate:

 class ViewController: CustomCellDelegate

4. 设置单元格的委托(delegate)

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

return cell
}

5. 在您的 View Controller 类中实现所需的方法。

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

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 是在我的 View Controller 中定义的数组:

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

选项 2. 使用闭包

处理它

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

1. 在您的单元类中声明一个闭包变量:

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

2. 在按钮处理程序中调用闭包。

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

3. 在包含 View Controller 类的 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)")
}

关于uitableview - 如何使用按钮标签快速访问自定义单元格的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29913066/

25 4 0