选定的表格视图单元格

时间:2018-12-04 13:02:45

标签: ios swift uitableview

我将TableView与选定的按钮一起使用,我的代码有问题,因为选择按钮后,我不知道单元格的IndexPath是什么。

我将文件TableView单元格与表视图cell.xib一起使用

@IBOutlet weak var lbTitle: UILabel!
@IBOutlet weak var lbDetail: UILabel!
@IBOutlet weak var btnCheckMark: UIButton!
override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

在我的View控制器中,我有这个:

  override func viewDidLoad() {
    super.viewDidLoad()
    self.topBar.rightBarButtonItem = UIBarButtonItem(title: "Apply", style: .done, target: self, action: #selector(self.apply))
    self.topBar.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "backButton"), style: .done, target: self, action: #selector(backHome))
    listeView.register(UINib.init(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "CheckList")
    listeView.dataSource = self
    listeView.delegate = self
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return deviceData.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    //let rowpath = indexPath.row
    let cell = tableView.dequeueReusableCell(withIdentifier: "CheckList") as! TableViewCell
    cell.lbTitle.text = "\(self.deviceData[indexPath.row].brandName) \(self.deviceData[indexPath.row].modelName)"
    cell.lbDetail.text = "\(self.deviceData[indexPath.row].operatorName) \(self.deviceData[indexPath.row].version), \(self.deviceData[indexPath.row].browserName) \(self.deviceData[indexPath.row].version)"
    //cell.selectionStyle = .none
    cell.btnCheckMark.addTarget(self, action: #selector(checkMarkButton(sender:)), for: .touchUpInside)
    return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print(indexPath.row)
    let test = TableViewCell()
    test.lbTitle.text = "11"

}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 71.0
}
@objc func checkMarkButton(sender: UIButton) {
    if sender.isSelected {
        sender.isSelected = false
        nb -= 1
        //rint(paramaters)
    } else {
        sender.isSelected = true
        paramaters["devicesList[\(nb)][deviceId]"] = id
        nb += 1
    }
    print(paramaters)
}

在我的功能checkMarkButton中,我想知道indexPath.row

4 个答案:

答案 0 :(得分:3)

在Swift中,最有效的方法是回调关闭

这很简单:没有协议,没有目标/动作,没有委托,没有标签,没有索引路径,没有视图数学,没有 let range = ctx.workbook.getSelectedRange(); range.load('address'); try { await ctx.sync(); } catch (err) { // log error } return range; 属性。

  • 在表示An internal error has occurred模型中,添加属性@objc

    deviceData
  • 单元格中,添加属性isSelectedvar isSelected = false 。将按钮连接到callback。在IBAction中,选择状态被切换,回调称为

    IBAction
  • 视图控制器中设置并处理IBAction

    中的回调
    var callback : ((UIButton) -> Void))?
    
    @IBAction func buttonPressed(_ sender : UIButton) {
       sender.isSelected.toggle()
       callback?(sender)
    }
    

答案 1 :(得分:0)

您可以使用Indexpath属性对按钮进行子类化,而改用该按钮。

所以:

class ButtonWithIndexPath : UIButton {
    var indexPath:IndexPath?
}

然后,当您分配所有其他属性时,将该属性分配给表中的cellforRowAt方法中的新按钮。

答案 2 :(得分:0)

使用tableView.indexPath(for: UITableViewCell)获取单元格的整个IndexPath。

示例用法:

@objc func checkMarkButton(sender: UIButton) {
    // do something else

    guard let cell = sender.superview as? UITableViewCell, let indexPath = tableView.indexPath(for: cell) else {
        return
    }

    print(indexPath.row)
}

如果您不想终止执行,请使用if let而不是guard let

答案 3 :(得分:0)

这不是正确的方法,而是尝试使用didSelectRowAt委托函数并更新数据,如下所示:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        data[indexPath.row].selected = !data[indexPath.row].selected
        tableView.reloadRows(at: [indexPath], with: .none)
    }

    //then on the cellForRowAt:
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "CheckList") as! TableViewCell
     cell.lbTitle.text = "\(self.deviceData[indexPath.row].brandName) \(self.deviceData[indexPath.row].modelName)"
     cell.lbDetail.text = "\(self.deviceData[indexPath.row].operatorName) \(self.deviceData[indexPath.row].version), \(self.deviceData[indexPath.row].browserName) \(self.deviceData[indexPath.row].version)"
    //cell.selectionStyle = .none
     cell.setSelected(data[indexPath.row].selected, animated: true)
     return cell
    }

通过这种方式,tableView和您的数据同步。