如何解决检测包含在Swift中多个部分的UITableView的UITableViewCell中的按钮上的点击
在UITableviewCell上,我尝试单击“ AddToCart”按钮,并立即单击此按钮,以隐藏“ AddToCart”按钮并显示“ +”和“-”按钮;它运行正常,但不幸的是,由于在第8、15、22行单元格上隐藏了此“ AddToCart”按钮,因此我也看到了其他单元格上也发生了类似的操作。
您能帮我解决这个问题吗?
import Foundation
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import SDWebImage
class ProductListScreen: UITableViewController {
var dbRef: DatabaseReference!
var tempProducts: [Product] = []
var imagesurlslist = [String]()
let activityIndicatorView = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.gray)
var products: [Product] = []
override func viewDidLoad() {
super.viewDidLoad()
activityIndicatorView.transform = CGAffineTransform(scaleX: 3,y: 3);
tableView.backgroundView = activityIndicatorView
activityIndicatorView.startAnimating()
dbRef = Database.database().reference().child("xxxxx").child("0").child("xxxxxxx")
dbRef.observe(DataEventType.value) { (snapshotAA) in
for snapshotchild in snapshotAA.children.allObjects as! [DataSnapshot] {
let snapshotchildobj = snapshotchild.value as? [String: AnyObject]
let image:String = snapshotchildobj?["imageurl"] as? String ?? ""
let title:String = snapshotchildobj?["name"] as? String ?? ""
let price:String = snapshotchildobj?["price"] as? String ?? ""
let units:String = snapshotchildobj?["units"] as? String ?? ""
let quantity:String = snapshotchildobj?["quantity"] as? String ?? ""
let quantityunits:String = quantity + " " + units as? String ?? ""
self.tempProducts.append(Product(url: image,title: title,price: price,quantity: quantityunits))
self.imagesurlslist.append(image)
}
self.products = self.tempProducts
self.tableView.reloadData()
}
}
var showImageIndex : Int?
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
print(products.count)
return products.count
}
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let product = products[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell",for: indexPath) as! ProductCell
showImageIndex = indexPath.row
cell.setProduct(product: product)
let image = imagesurlslist[indexPath.row]
cell.productImage!.sd_setImage(with: URL(string: image),placeholderImage: UIImage(named: "xxxxxxxx"))
cell.cartButtonOutlet.tag = indexPath.row
cell.tapCartButton = {
print(indexPath.row)
print(ProductCell().addtocartbuttonclicked)
ProductCell().addtocartbuttonclicked = "Yes"
}
return cell;
}
}
*******************************
import Foundation
import UIKit
class ProductCell: UITableViewCell {
var index: IndexPath?
var isAddToCartVisible: Bool?
var addtocartbuttonclicked:String = "No"
@IBOutlet weak var productImage: UIImageView!
@IBOutlet weak var productTitle: UILabel!
@IBOutlet weak var productPrice: UILabel!
@IBOutlet weak var productQuantity: UILabel!
var tapCartButton: (() -> Void)? = nil
let productImageView: UIImageView = {
let productImage = UIImageView()
productImage.image = UIImage(named: "xxxxxxxxx")
productImage.translatesAutoresizingMaskIntoConstraints = false
productImage.layer.cornerRadius = 20
productImage.layer.masksToBounds = true
return productImage
}()
override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
super.init(style: .subtitle,reuseIdentifier: reuseIdentifier)
addSubview(productImageView)
// ios 9 constraints
productImageView.leftAnchor.constraint(equalTo:self.leftAnchor,constant: 10).isActive = true
productImageView.centerYAnchor.constraint(equalTo:self.centerYAnchor).isActive = true
productImageView.widthAnchor.constraint(equalToConstant: 40)
productImageView.heightAnchor.constraint(equalToConstant: 40)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func setProduct(product: Product){
productTitle.text = product.title
productPrice.text = product.price
productQuantity.text = product.quantity
}
// **************** Objects Initialization ****************
@IBOutlet weak var postiveButtonLabel: UIButton!
@IBOutlet weak var negativeButtonLabel: UIButton!
@IBAction func positiveButton(_ sender: UIButton) {
print("pblisterener clicked")
let mystring = String(describing: (selectedQuantity.text)!).trimmingCharacters(in: .whitespacesAndNewlines)
let myInt1 = Int(mystring)
print (myInt1!+1)
selectedQuantity.text = " "+String(myInt1!+1)
}
@IBAction func negativeButton(_ sender: Any) {
print("mbnlistener clicked")
let mystring = String(describing: (selectedQuantity.text)!).trimmingCharacters(in: .whitespacesAndNewlines)
let myInt1 = Int(mystring)
if(myInt1 != 1){
selectedQuantity.text = " "+String(myInt1!-1)
}
}
@IBOutlet weak var selectedQuantity: UILabel!
@IBOutlet weak var cartButtonOutlet: UIButton!
@IBAction func cartClick(_ sender: Any) {
addtocartbuttonclicked = "Yes"
print(addtocartbuttonclicked)
if( addtocartbuttonclicked == "Yes" ) {
tapCartButton?()
cartButtonOutlet.isHidden = true
postiveButtonLabel.isHidden = false
negativeButtonLabel.isHidden = false
selectedQuantity.isHidden = false
}
addtocartbuttonclicked = "Yes"
}
}
Please refer this Video for more Info : https://youtu.be/kUMLAmksr-w
解决方法
当您滚动浏览UITableView
或UICollectionView
时,这些视图将重新使用通过dequeueReusableCell
函数调用从屏幕上消失的单元格。这意味着您应该覆盖或还原这些单元格的状态,因为表格或集合视图不会更改它们。最好通过从func prepareForReuse()
覆盖UITableViewCell
来完成此操作,在该位置应删除该单元格的状态。对于您的情况,您应该隐藏“添加到购物车”按钮,并且同样重要的是,取消设置tapCartButton
闭包(即将其设置为nil,因为将来可能会引起很多麻烦)。
只要UITableViewCell
重用特定的UITableView
,就会调用此函数。
您的数据结构需要一个属性,可在其中跟踪是否已将其“添加到购物车”
设置单元格数据时,显示或隐藏按钮:
func setProduct(product: Product){
productTitle.text = product.title
productPrice.text = product.price
productQuantity.text = product.quantity
// show or hide the add to cart button
if product.isInCart {
cartButtonOutlet.isHidden = true
} else {
cartButtonOutlet.isHidden = false
}
}
然后,在cellForRowAt
中创建的闭包中:
cell.tapCartButton = {
print(indexPath.row)
// this is wrong...
// you create a NEW ProductCell and print the value of addtocartbuttonclicked
//print(ProductCell().addtocartbuttonclicked)
// then you create ANOTHER NEW ProductCell and set the value of addtocartbuttonclicked
//ProductCell().addtocartbuttonclicked = "Yes"
// closure ends,and your NEW ProductCell goes away
// instead,you want to update your data
// something like
self.products[indexPath.row].isInCart = true
}
,
根据您的代码,我假设您的“产品”类似于:-
struct Product {
var url: String?
var title: String?
var price: String?
var quantity: String?
var isAddedInCart: Bool? // I have added extra varible to resolve your issue
}
现在,我必须借助“ iwegoInCart”变量来修改您现有的代码,以解决您的问题。
按如下方式使用它:-
import Foundation
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import SDWebImage
class ProductListScreen: UITableViewController {
var dbRef: DatabaseReference!
var tempProducts: [Product] = []
var imagesurlslist = [String]()
let activityIndicatorView = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.gray)
var products: [Product] = []
override func viewDidLoad() {
super.viewDidLoad()
activityIndicatorView.transform = CGAffineTransform(scaleX: 3,y: 3);
tableView.backgroundView = activityIndicatorView
activityIndicatorView.startAnimating()
dbRef = Database.database().reference().child("xxxxx").child("0").child("xxxxxxx")
dbRef.observe(DataEventType.value) { (snapshotAA) in
for snapshotchild in snapshotAA.children.allObjects as! [DataSnapshot] {
let snapshotchildobj = snapshotchild.value as? [String: AnyObject]
let image:String = snapshotchildobj?["imageurl"] as? String ?? ""
let title:String = snapshotchildobj?["name"] as? String ?? ""
let price:String = snapshotchildobj?["price"] as? String ?? ""
let units:String = snapshotchildobj?["units"] as? String ?? ""
let quantity:String = snapshotchildobj?["quantity"] as? String ?? ""
let quantityunits:String = quantity + " " + units as? String ?? ""
self.tempProducts.append(Product(url: image,title: title,price: price,quantity: quantityunits,isAddedInCart: false))
self.imagesurlslist.append(image)
}
self.products = self.tempProducts
self.tableView.reloadData()
}
}
var showImageIndex : Int?
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
print(products.count)
return products.count
}
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let product = products[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell",for: indexPath) as! ProductCell
showImageIndex = indexPath.row
cell.setProduct(product: product)
let image = imagesurlslist[indexPath.row]
cell.productImage!.sd_setImage(with: URL(string: image),placeholderImage: UIImage(named: "xxxxxxxx"))
cell.cartButtonOutlet.tag = indexPath.row
cell.tapCartButton = {
print(indexPath.row)
print(ProductCell().addtocartbuttonclicked)
ProductCell().addtocartbuttonclicked = "Yes"
product.isAddedInCart = true
self.tableView.reloadData()
}
return cell;
}
}
//*******************************
import Foundation
import UIKit
class ProductCell: UITableViewCell {
var index: IndexPath?
var isAddToCartVisible: Bool?
var addtocartbuttonclicked:String = "No"
@IBOutlet weak var productImage: UIImageView!
@IBOutlet weak var productTitle: UILabel!
@IBOutlet weak var productPrice: UILabel!
@IBOutlet weak var productQuantity: UILabel!
var tapCartButton: (() -> Void)? = nil
let productImageView: UIImageView = {
let productImage = UIImageView()
productImage.image = UIImage(named: "nammadukhaninkannada")
productImage.translatesAutoresizingMaskIntoConstraints = false
productImage.layer.cornerRadius = 20
productImage.layer.masksToBounds = true
return productImage
}()
override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
super.init(style: .subtitle,reuseIdentifier: reuseIdentifier)
addSubview(productImageView)
// ios 9 constraints
productImageView.leftAnchor.constraint(equalTo:self.leftAnchor,constant: 10).isActive = true
productImageView.centerYAnchor.constraint(equalTo:self.centerYAnchor).isActive = true
productImageView.widthAnchor.constraint(equalToConstant: 40)
productImageView.heightAnchor.constraint(equalToConstant: 40)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func setProduct(product: Product){
productTitle.text = product.title
productPrice.text = product.price
productQuantity.text = product.quantity
if product.isAddedInCart == true {
cartButtonOutlet.isHidden = true
postiveButtonLabel.isHidden = false
negativeButtonLabel.isHidden = false
selectedQuantity.isHidden = false
}
else{
cartButtonOutlet.isHidden = false
postiveButtonLabel.isHidden = true
negativeButtonLabel.isHidden = true
selectedQuantity.isHidden = true
}
}
// **************** Objects Initialization ****************
@IBOutlet weak var postiveButtonLabel: UIButton!
@IBOutlet weak var negativeButtonLabel: UIButton!
@IBAction func positiveButton(_ sender: Any) {
}
@IBAction func negativeButton(_ sender: Any) {
}
@IBOutlet weak var selectedQuantity: UILabel!
@IBOutlet weak var cartButtonOutlet: UIButton!
@IBAction func cartClick(_ sender: Any) {
addtocartbuttonclicked = "Yes"
print(addtocartbuttonclicked)
if( addtocartbuttonclicked == "Yes" ) {
tapCartButton?()
}
addtocartbuttonclicked = "Yes"
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。