tableview问题,indexPath为零

时间:2018-08-27 05:28:47

标签: ios swift uitableview

我在表视图中有一个按钮和一个标签(我正在使用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



}

2 个答案:

答案 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