我在表视图中有一个按钮和一个标签(我正在使用8行),由于某种原因,当我单击第一个按钮时,我得到indexPath nil错误,但是当我单击第二个按钮(第二行)时,我得到了第一行标签。当我单击第三行按钮时,我得到第二行标签等。为什么它们未对齐。我想要当我单击第一行按钮以获取第一行标签等。请参见下面的代码。谢谢 !!
@objc func btnAction(_ sender: AnyObject) {
var position: CGPoint = sender.convert(.zero, to: self.table)
print (position)
let indexPath = self.table.indexPathForRow(at: position)
print (indexPath?.row)
let cell: UITableViewCell = table.cellForRow(at: indexPath!)! as
UITableViewCell
print (indexPath?.row)
print (currentAnimalArray[(indexPath?.row)!].name)
GlobalVariable.addedExercises.append(currentAnimalArray[(indexPath?.row)!].name)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? TableCell else {return UITableViewCell() }
// print(indexPath)
cell.nameLbl.text=currentAnimalArray[indexPath.row].name
// print("\(#function) --- section = \(indexPath.section), row = \(indexPath.row)")
// print (currentAnimalArray[indexPath.row].name)
cell.b.tag = indexPath.row
// print (indexPath.row)
cell.b.addTarget(self, action: #selector(SecondVC.btnAction(_:)), for: .touchUpInside)
return cell
}
答案 0 :(得分:2)
如果您别无选择,则框架数学是最坏的情况。在这里,您有很多选择。
例如,为什么不使用分配给按钮的tag
?
@objc func btnAction(_ sender: UIButton) {
GlobalVariable.addedExercises.append(currentAnimalArray[sender.tag].name)
}
一个 swiftier 更加有效的解决方案是回调闭包:
在TableCell
中添加按钮动作和一个callback
属性。不需要插座。断开插座,然后将按钮连接到Interface Builder中的操作。点击按钮后,将调用回调。
class TableCell: UITableViewCell {
// @IBOutlet var b : UIButton!
@IBOutlet var nameLbl : UILabel!
var callback : (()->())?
@IBAction func btnAction(_ sender: UIButton) {
callback?()
}
}
删除控制器中的按钮动作。
在cellForRow
中为callback
属性指定一个闭包
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// no guard, the code must not crash. If it does you made a design mistake
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! TableCell
let animal = currentAnimalArray[indexPath.row]
cell.nameLbl.text = animal.name
cell.callback = {
GlobalVariable.addedExercises.append(animal.name)
}
return cell
}
您看到实际上根本不需要索引路径。 animal
对象在闭包中捕获。
答案 1 :(得分:0)
您已经通过了带有按钮标签的PDFBoxDebugger
。只需将标签用作索引
indexPath.row