我有一个tableView动态填充了几个部分中的自定义单元格。
在我的CustomCell类中,我在单元格中有一个@IBAction用于自定义复选框按钮。有没有办法在IBAction函数中获取发送者按钮的节号?
类似的东西:
@IBAction func checkboxButton(sender: CheckBox) {
//Change Button state
if sender.isChecked == true { sender.isChecked = false }
else { sender.isChecked = true }
//Get section number of clicked button
var sectionNumber = ???????
}
答案 0 :(得分:8)
您可以通过计算发件人的位置并在UITableView
var position: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
if let indexPath = self.tableView.indexPathForRowAtPoint(position)
{
let section = indexPath.section
let row = indexPath.row
}
这就是Apple在Accessory示例中的表现。 https://developer.apple.com/library/ios/samplecode/Accessory/Listings/AccessoryViewController_m.html#//apple_ref/doc/uid/DTS40008066-AccessoryViewController_m-DontLinkElementID_4
答案 1 :(得分:4)
在Swift 3.0中,有些东西略有变化,如'CGPointZero' - > 'CGPoint.zero'& 'indexPathForRowAtPoint' - > 'indexPathForRow(at:position)'等等,这样您就可以从这段代码中获取抽头按钮的实际行和部分:
let position: CGPoint = sender.convert(CGPoint.zero, to: self.tableView)
if let indexPath = self.tableView.indexPathForRow(at: position)
{
let section = indexPath.section
let row = indexPath.row
}
答案 2 :(得分:2)
在调用按钮时,在Swift 3和Swift 4中查找indexPath,
//首先在“cellForRowAt”按钮上添加目标
cell.myBtn.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)
//添加功能
func btnAction(_ sender: UIButton) {
let point = sender.convert(CGPoint.zero, to: yourTableView as UIView)
let indexPath: IndexPath! = yourTableView.indexPathForRow(at: point)
print("indexPath.row is = \(indexPath.row) && indexPath.section is = \(indexPath.section)")
}
答案 3 :(得分:1)
其中一种方法,假设您在单元格中有自定义单元格和按钮... 通常的模式是: (如果您在内部配置单元格时使用带有数据源的表视图):
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
你可以设置:
cell.button.tag = sectionIndex
所以:
func checkboxButton(sender: CheckBox) { ...
sender.tag将是sectionIndex
希望你明白了。
答案 4 :(得分:0)
我最近提出了解决这个问题的方法,利用Segues并在Swift 2.2和XCode8中实现它。
我有一个自定义单元格,我用于具有2个标签和UIButton的标头。 我的所有数据都在一个数组中,我想动态访问数据。每个部分都是一个部分标题数组,在该类中,这些部分包含其他数组以完成我的tableView生成。我的目标是根据自定义单元格(标题)中的按钮单击获取该部分的索引,并在不同的视图中更改数据。
使用我使用的自定义标题单元格填充tableView:
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let myCell = tableView.dequeueReusableCellWithIdentifier("REUSABLE ID")! as! MyHeaderCell
let team = array[section]
myCell.teamName.text = team.name
myCell.projectName.text = team.project
myCell.addMemberButton.tag = section
return myCell
}
使用故事板,MyHeaderCell中按钮(addMemberButton)的IBOutlet具有.tag字段,我用它来保存节索引。因此,当我准备segue时,我可以使用此值动态访问DataSource中的数组。如下
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "segue1" {
...
}else if segue.identifier == "AddMemberSegue"{
let ix = sender?.tag
let destVC = segue.destinationViewController as! AddMemberViewController
self.myArray = array[ix!]
destVC.delegate = self
}else if segue.identifier == "segue3"{
...
}
}
此处发件人是按钮,因此.tag字段为我们提供了访问数组中正确位置的特定部分索引
希望这有助于某人。