带按钮的Swift UitableViewcell

时间:2018-02-18 15:29:50

标签: ios swift uitableview

我在UITABLEVIEW

中有一个奇怪的行为

我有一个带Button的TableView,我想要做的是当我点击tableView中的一个按钮时,我希望颜色边框变为红色。

pb的颜色不仅对于单击的按钮有所改变,而且对于tableview中的其他行也是如此:

这是我的实现

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! chooseProductTVC 

    cell.Btn_AddProduct.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)


    return cell
}

@objc func btnAction(_ sender: MyButton) {

    sender.BorderColor = UIColor.red
    let point = sender.convert(CGPoint.zero, to: tbl_View_ChooseProduct as UIView)
    let indexPath: IndexPath! = self.tbl_View_ChooseProduct.indexPathForRow(at: point)
     let object = self.fetchedResultsController.object(at: indexPath)
    print (object.produit_name)
    print("row is = \(indexPath.row) && section is = \(indexPath.section)")
} 

如下图所示,我只点击了第一个按钮(Abricot)==>其他按钮也自动更改了边框(Avocat)和许多其他按钮

谢谢你的帮助

enter image description here

3 个答案:

答案 0 :(得分:1)

这是因为在加载表时尝试重新设置单元格出列,假设此处默认为blue

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

  let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")  

  cell.Btn_AddProduct.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

  if selected

    cell.Btn_AddProduct.BorderColor = UIColor.red

   else

   cell.Btn_AddProduct.BorderColor = UIColor.blue

  return cell

} 

答案 1 :(得分:0)

由于我们重复使用单元格进行显示,因此我们必须在每次出列后修改颜色。

将新属性selected添加到产品型号。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! chooseProductTVC 

    cell.Btn_AddProduct.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)
    let object = self.resultArray(at: indexPath.row)
    if object.selected
         cell.Btn_AddProduct.BorderColor = .red
    else
        cell.Btn_AddProduct.BorderColor = .blue

    return cell
}

@objc func btnAction(_ sender: MyButton) {
    sender.BorderColor = UIColor.red
    let point = sender.convert(CGPoint.zero, to: tbl_View_ChooseProduct as UIView)
    let indexPath: IndexPath! = self.tbl_View_ChooseProduct.indexPathForRow(at: point)
    let object = self.fetchedResultsController.object(at: indexPath)
    object.selected = true
    print (object.produit_name)
    print("row is = \(indexPath.row) && section is = \(indexPath.section)")
} 

提示:您可以使用tableChooseProduct(iOS)代替tbl_View_ChooseProduct。(android)。这个link可能会有所帮助。

答案 2 :(得分:0)

您必须将default Colors存储在Dictionary

var orderColor = [Int : UIColor]()

override func viewDidLoad() {
super.viewDidLoad()

    for i in 0...29  // TotaL number of rows
    {
        orderColor[i] = UIColor.blue // DEFAULT color of the Button
    }
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

   let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! chooseProductTVC

   cell.Btn_AddProduct.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

   cell.Btn_AddProduct.BorderColor = orderColor[indexPath.row] 

   cell.selectionStyle = .none
   return cell
}


@objc func btnAction(_ sender: MyButton) {


   let point = sender.convert(CGPoint.zero, to: tbl_View_ChooseProduct as UIView)
   let indexPath: IndexPath! = self.tbl_View_ChooseProduct.indexPathForRow(at: point)

    orderColor[indexPath.row] = UIColor.red

    tbl_View_ChooseProduct.reloadData()  

}