在自定义单元格按钮操作中获取节号
Get section number in custom cell button action
我有一个 tableView,在几个部分中动态填充了自定义单元格。
在我的 CustomCell class 中,我有一个 @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 = ???????
}
您可以通过计算发件人的位置并在 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 在配件示例中的做法。
https://developer.apple.com/library/ios/samplecode/Accessory/Listings/AccessoryViewController_m.html#//apple_ref/doc/uid/DTS40008066-AccessoryViewController_m-DontLinkElementID_4
其中一种方法,假设您在单元格内有自定义单元格和按钮...
通常的模式是:
(如果您使用 table 视图和数据源)在内部配置单元格时:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
您可以设置:
cell.button.tag = sectionIndex
所以在:
func checkboxButton(sender: CheckBox) { ...
sender.tag 将是 sectionIndex
希望你明白了。
我最近提出了一个解决这个问题的方法,利用 Segues 并在 Swift 2.2 和 XCode8.
中实现它
我有一个用于 header 的自定义单元格,它有 2 个标签和一个 UIButton。
我所有的数据都在一个数组中,我想动态访问这些数据。每个部分都是 header 部分的数组,在 class 部分中,这些部分包含额外的数组来完成我的 tableView 的生成。我的目标是根据自定义单元格 (header) 中的按钮单击获取该部分的索引,并在不同的视图中更改数据。
要用我使用的自定义 header 单元格填充 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 时,我可以使用此值动态访问数据源中的数组。如下
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 字段为我们提供了特定的部分索引以访问数组中的正确位置
希望这对某人有所帮助。
在 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
}
调用按钮时在Swift4和Swift5中查找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)")
}
我有一个 tableView,在几个部分中动态填充了自定义单元格。
在我的 CustomCell class 中,我有一个 @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 = ???????
}
您可以通过计算发件人的位置并在 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 在配件示例中的做法。 https://developer.apple.com/library/ios/samplecode/Accessory/Listings/AccessoryViewController_m.html#//apple_ref/doc/uid/DTS40008066-AccessoryViewController_m-DontLinkElementID_4
其中一种方法,假设您在单元格内有自定义单元格和按钮... 通常的模式是: (如果您使用 table 视图和数据源)在内部配置单元格时:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
您可以设置:
cell.button.tag = sectionIndex
所以在:
func checkboxButton(sender: CheckBox) { ...
sender.tag 将是 sectionIndex
希望你明白了。
我最近提出了一个解决这个问题的方法,利用 Segues 并在 Swift 2.2 和 XCode8.
中实现它我有一个用于 header 的自定义单元格,它有 2 个标签和一个 UIButton。 我所有的数据都在一个数组中,我想动态访问这些数据。每个部分都是 header 部分的数组,在 class 部分中,这些部分包含额外的数组来完成我的 tableView 的生成。我的目标是根据自定义单元格 (header) 中的按钮单击获取该部分的索引,并在不同的视图中更改数据。
要用我使用的自定义 header 单元格填充 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 时,我可以使用此值动态访问数据源中的数组。如下
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 字段为我们提供了特定的部分索引以访问数组中的正确位置
希望这对某人有所帮助。
在 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
}
调用按钮时在Swift4和Swift5中查找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)")
}