简体   繁体   中英

Rows overwriting each other in UITableview Swift

My applications paymentWindow

Hey I am having some problems with a UITableView in Swift 3.0, that are overwriting my page setup, when I am scrolling.

I am using a custom UITableViewCell to define the rows info.

Anyone know that problem?

My current setup looks like this.

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

        let cell: BasketTableCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BasketTableCell
        cell.backgroundColor = .clear
        let i = indexPath.row  
        if(indexPath.section == 0){
            cell.productView.alpha = 1.0

            print(i)
            let b = basketContainer[i]


            var descString = ""
            var priceFromSettings = 0.0
            var count = 0
            for d in b.settings
            {
                descString.append(d.productItem.danishName)
                priceFromSettings += d.price
                count += 1

                if(count != b.settings.count){ descString.append(", ")}
            }
            let sumPrice = priceFromSettings + Double((b.product.price))
            let finalPrice = sumPrice * Double((b.amount))!
            total += finalPrice
            let withFormat = formatter.string(from: finalPrice  as NSNumber)

            if(b.settings.count == 0){  cell.productName.text = "\(b.amount) x \(b.product.danishName)"}
            else
            {
                cell.productName.text = "\(b.amount) x \(b.product.danishName) (\(descString))"
            }
            cell.productPrice.text = "\(withFormat!)"


        }
        if(indexPath.section == 1 && indexPath.row == 0){
            if(bc.discount > 0.0){
                cell.discountView.alpha = 1.0
                let withFormat = formatter.string(from: bc.discount  as NSNumber)
                cell.discountName.text = "Discount"
                cell.discountPrice.text = "-\(withFormat!)"
            }
        }

        if(indexPath.section == 1 && indexPath.row == 1){
            if(tipItems.count > 0){
                cell.tipName.text = "Tips"
                cell.tipView.alpha = 1.0
                let finalTotal = (total * bc.tipProcentage/100)
                bc.tipAmount = finalTotal
                let withFormat = formatter.string(from: finalTotal  as NSNumber)
                cell.tipPrice.text = "\(withFormat!)"
            }

        }
        if(indexPath.section == 1 && indexPath.row == 2)
        {
            cell.backgroundColor = .coffee()

        }
        if(indexPath.section == 1 && indexPath.row == 3){
            cell.totalView.alpha = 1.0
            cell.totalName.text = "Total"
            let finalTotal = total + (total * bc.tipProcentage/100) - bc.discount
            bc.total = finalTotal
            let withFormat = formatter.string(from: bc.total  as NSNumber)

            cell.totalPrice.text = "\(withFormat!)"

        }

        if(indexPath.section == 1 && indexPath.row == 4){
            if(tipItems.count > 0){
                cell.tipLabel.text = "Add a tip"
                cell.tipSelectView.alpha = 1.0
                if(tableRefreshed == false)
                {
                    tableRefreshed = true
                    var x = 0
                    for k in tipItems{
                        cell.tipSelector.insertSegment(withTitle: k, at: x, animated: false)
                        x += 1
                    }
                }
                cell.tipSelector.addTarget(self, action: #selector(tipChanged(sender:)), for: .valueChanged)
            }

        }
        if(indexPath.section == 1 && indexPath.row == 5)
        {

            cell.deliveryButton.addTarget(self, action: #selector(selectedDelivery(sender:)), for: .touchUpInside)
            cell.collectButton.addTarget(self, action: #selector(selectedCollect(sender:)), for: .touchUpInside)
            //Both table numbers and collect in bar
            if(pi.deliveryType == 0)
            {

                if(bc.tableNumber != 0)
                {
                    bc.collectIt = false
                    UIView.animate(withDuration: 0.1, animations: {
                        cell.deliveryButton.setTitle("We will deliver to table \(bc.tableNumber)", for: .normal)
                        cell.deliveryButton.frame = CGRect(x:0,y:0, width:self.view.frame.width - 50,height:50)
                        cell.collectButton.frame = CGRect(x:self.view.frame.width - 50,y:0, width:50,height:50)
                        cell.collectButton.setTitle("X", for: .normal)
                    })
                }
                if(bc.tableNumber == 0 && bc.collectIt == false)
                {
                    UIView.animate(withDuration: 0.1, animations: {
                        cell.deliveryButton.setTitle("Deliver to table", for: .normal)
                        cell.deliveryButton.frame = CGRect(x:0,y:0, width:cell.deliveryView.frame.width/2,height:cell.deliveryView.frame.height)
                        cell.collectButton.frame = CGRect(x:cell.deliveryView.frame.width/2,y:0, width:cell.deliveryView.frame.width/2,height:cell.deliveryView.frame.height)
                        cell.collectButton.setTitle("Collect in the Bar", for: .normal)
                    })
                }

                //Collect
                if(bc.tableNumber == 0 && bc.collectIt == true)
                {
                    UIView.animate(withDuration: 0.1, animations: {


                        cell.deliveryButton.setTitle("X", for: .normal)
                        cell.deliveryButton.frame =  CGRect(x:0,y:0, width:50,height:50)
                        cell.collectButton.frame = CGRect(x:50,y:0, width:self.view.frame.width - 50,height:50)
                        cell.collectButton.setTitle("Collect it at the Bar", for: .normal)
                    })
                }
            }
            if(pi.deliveryType == 1)
            {
                cell.collectButton.alpha = 0.0
                if(bc.tableNumber > 0)
                {
                    cell.deliveryButton.setTitle("We will deliver to table \(bc.tableNumber)", for: .normal)
                    cell.deliveryButton.frame = CGRect(x:0,y:0, width:self.view.frame.width,height:50)
                }
                else
                {
                    cell.deliveryButton.setTitle("Choose you´re table", for: .normal)
                    cell.deliveryButton.frame = CGRect(x:0,y:0, width:self.view.frame.width,height:50)
                }
            }

            if(pi.deliveryType == 2)
            {   bc.collectIt = true
                cell.deliveryButton.alpha = 0.0
                cell.collectButton.frame = CGRect(x:0,y:0, width:self.view.frame.width,height:50)
                cell.collectButton.setTitle("Collect you're order at \(pi.collectPlaceEnglish)", for: .normal)

            }
            cell.deliveryView.alpha = 1.0
        }
        if(indexPath.section == 1 && indexPath.row == 6){
            if(bc.paymentMethods.count > 2)
            { cell.promoView.alpha = 1.0
            print("BUTTON\(bc.paymentType)")
            if(bc.paymentType != 0)

            {
                let i = bc.paymentMethods[bc.paymentType]?.englishName
                cell.promoButton.setTitle("Payment type: \(i!)", for: .normal)
            }
            else
            {
            cell.promoButton.setTitle("Choose Payment type", for: .normal)
            }
            cell.promoButton.backgroundColor = .moneyGreen()


            cell.promoButton.addTarget(self, action: #selector(addPaymentType(sender:)), for: .touchUpInside)
            }
            else
            {
               for i in bc.paymentMethods
               {
                print(i.key)
                    bc.paymentType = i.key
               }
            }
        }
        if(indexPath.section == 1 && indexPath.row == 7){

            cell.commentView.alpha = 1.0
            cell.commentText.delegate = self
            if(bc.comment != ""){cell.commentText.text = bc.comment}
        }
        if(indexPath.section == 1 && indexPath.row == 9){
            print("reloadUser\(UserContainer.count)")

            if(UserContainer.count == 0)
            {
                cell.promoView.alpha = 1.0

                cell.promoButton.setTitle("Login or create user", for: .normal)
                cell.promoButton.backgroundColor = .moneyGreen()


                cell.promoButton.addTarget(self, action: #selector(loginOrCreateUser(sender:)), for: .touchUpInside)
            }
            else
            {
                cell.promoView.alpha = 0.0
            }

        }
        cell.selectionStyle = .none

        if(bc.paymentType != 0 && bc.collectIt == true || bc.paymentType != 0 && bc.tableNumber > 0)
        {
            buyButton.alpha = 1.0
            buyButton.backgroundColor = .moneyGreen()
            let name:String = (bc.paymentMethods[bc.paymentType]?.englishName)!
            buyButton.setTitle("Pay with \(name)", for: .normal)
            buyButton.isUserInteractionEnabled = true
        }
        else
        {
            buyButton.alpha = 0.5
            buyButton.backgroundColor = .lightGray
            buyButton.isUserInteractionEnabled = false
            buyButton.setTitle("Buy", for: .normal)
        }

        return cell
    }

And the cell looks like this.

class BasketTableCell:UITableViewCell,UITextViewDelegate {

let deliveryView = UIView()
let deliveryButton = UIButton()
let collectButton = UIButton()


var productView = UIView()
var productName = UITextView()
let productPrice = UITextView()
let deleteButton = UIImageView()

let discountView = UIView()
let discountName = UITextView()
let discountPrice = UITextView()

let tipView = UIView()
let tipName = UITextView()
let tipPrice = UITextView()

let totalView = UIView()
let totalName = UITextView()
let totalPrice = UITextView()

let tipSelectView = UIView()
let tipLabel = UILabel()
var tipSelector = UISegmentedControl()

let commentView = UIView()
let commentButton = UIButton()

let commentTextView = UIView()
let commentText = UITextView()

let promoView = UIView()
let promoButton = UIButton()


override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)



    deliveryView.frame = CGRect(x:0,y:0, width:screenSize.width,height:50)
    deliveryView.backgroundColor = .clear
    deliveryView.alpha = 0.0
    contentView.addSubview(deliveryView)


    deliveryButton.frame = CGRect(x:0,y:0, width:deliveryView.frame.width/2,height:deliveryView.frame.height)
    deliveryButton.setTitle("Deliver to table", for: .normal)
    deliveryButton.backgroundColor = UIColor.burntOrange() 
    deliveryView.addSubview(deliveryButton)

    collectButton.frame = CGRect(x:deliveryView.frame.width/2,y:2, width:deliveryView.frame.width/2,height:deliveryView.frame.height)
    collectButton.setTitle("Collect in the Bar", for: .normal)
    collectButton.backgroundColor = UIColor.lightGray
    deliveryView.addSubview(collectButton)

    productView.frame = CGRect(x:0,y:0, width:screenSize.width,height:30)
    productView.alpha = 0.0
    productView.backgroundColor = .clear
    contentView.addSubview(productView)

    productName.frame = CGRect(x:5,y:0, width:productView.frame.width - 105,height:productView.frame.height)
    productName.backgroundColor = .clear
    productName.textAlignment = .left
    productName.font = UIFont (name: "HelveticaNeue", size: 14)
    productName.contentInset = UIEdgeInsetsMake(2,0,0,0);
    productName.isUserInteractionEnabled = false
    productView.addSubview(productName)

    productPrice.frame = CGRect(x:productView.frame.width - 120,y:2, width:100,height:30)
    productPrice.backgroundColor = .clear
    productPrice.textAlignment = .right
    productPrice.font = UIFont (name: "HelveticaNeue", size: 14)
    productPrice.contentInset = UIEdgeInsetsMake(0,-8,0,0);
    productPrice.isUserInteractionEnabled = false
    productView.addSubview(productPrice)

    deleteButton.image = UIImage(named:"remove")
    deleteButton.frame = CGRect(x:productView.frame.width - 30,y:5, width:30,height:30)
    productView.addSubview(deleteButton)




    discountView.frame = CGRect(x:0,y:0, width:screenSize.width,height:30)
    discountView.backgroundColor = .clear
    discountView.alpha = 0.0
    contentView.addSubview(discountView)

    discountName.frame = CGRect(x:5,y:0, width:discountView.frame.width - 105,height:discountView.frame.height)
    discountName.backgroundColor = .clear
    discountName.textAlignment = .left
    discountName.font = UIFont (name: "HelveticaNeue", size: 12)
    discountName.contentInset = UIEdgeInsetsMake(2,0,0,0);
    discountName.isUserInteractionEnabled = false
    discountView.addSubview(discountName)

    discountPrice.frame = CGRect(x:discountView.frame.width - 100,y:0, width:100,height:discountView.frame.height)
    discountPrice.backgroundColor = .clear
    discountPrice.textAlignment = .right
    discountPrice.font = UIFont (name: "HelveticaNeue", size: 12)
    discountPrice.contentInset = UIEdgeInsetsMake(0,-8,0,0);
    discountPrice.isUserInteractionEnabled = false
    discountView.addSubview(discountPrice)



    tipView.frame = CGRect(x:0,y:0, width:screenSize.width,height:30)
    tipView.backgroundColor = .clear
    tipView.alpha = 0.0
    contentView.addSubview(tipView)


    tipName.frame = CGRect(x:5,y:0, width:tipView.frame.width - 105,height:tipView.frame.height)
    tipName.backgroundColor = .clear
    tipName.textAlignment = .left
    tipName.font = UIFont (name: "HelveticaNeue", size: 12)
    tipName.contentInset = UIEdgeInsetsMake(2,0,0,0);
    tipName.isUserInteractionEnabled = false
    tipView.addSubview(tipName)


    tipPrice.frame = CGRect(x:tipView.frame.width - 100,y:0, width:100,height:tipView.frame.height)

    tipPrice.backgroundColor = .clear
    tipPrice.textAlignment = .right
    tipPrice.font = UIFont (name: "HelveticaNeue", size: 12)
    tipPrice.contentInset = UIEdgeInsetsMake(0,-8,0,0);
    tipPrice.isUserInteractionEnabled = false
    tipView.addSubview(tipPrice)



    totalView.frame = CGRect(x:0,y:0, width:screenSize.width,height:50)
    totalView.backgroundColor = .clear
    totalView.alpha = 0.0
    contentView.addSubview(totalView)


    totalName.frame = CGRect(x:5,y:0, width:totalView.frame.width - 105,height:totalView.frame.height)
    totalName.backgroundColor = .clear
    totalName.textAlignment = .left
    totalName.font = UIFont (name: "HelveticaNeue", size: 15)
    totalName.contentInset = UIEdgeInsetsMake(2,0,0,0);
    totalName.isUserInteractionEnabled = false
    totalView.addSubview(totalName)


    totalPrice.frame = CGRect(x:totalView.frame.width - 100,y:0, width:100,height:totalView.frame.height)
    totalPrice.backgroundColor = .clear
    totalPrice.textAlignment = .right
    totalPrice.font = UIFont (name: "HelveticaNeue-bold", size: 15)
    totalPrice.contentInset = UIEdgeInsetsMake(0,-8,0,0);
    totalPrice.isUserInteractionEnabled = false
    totalView.addSubview(totalPrice)



    tipSelectView.frame = CGRect(x:0,y:0, width:screenSize.width,height:60)
    tipSelectView.backgroundColor = .clear
    tipSelectView.alpha = 0.0
    contentView.addSubview(tipSelectView)


    tipLabel.frame = CGRect(x:5,y:0, width:tipView.frame.width,height:15)
    tipLabel.text = "Add a tip"
    tipLabel.font = UIFont (name: "HelveticaNeue-bold", size: 12)

    tipSelectView.addSubview(tipLabel)

    tipSelector.selectedSegmentIndex = 0
    tipSelector.tintColor = .coffee()
    tipSelector.frame = CGRect(x:5,y:20, width:tipView.frame.width - 10,height:30)
    tipSelectView.addSubview(tipSelector)



    commentView.frame = CGRect(x:0,y:0, width:screenSize.width,height:80)
    commentView.backgroundColor = .clear
    commentView.alpha = 0.0
    contentView.addSubview(commentView)


    commentText.frame = CGRect(x:5,y:0, width:commentView.frame.width-10,height:80)
    commentText.backgroundColor = UIColor.white
    commentText.isUserInteractionEnabled = true
    commentText.textAlignment = .center
    commentText.text = "Write a comment"
    commentText.returnKeyType = .done
    commentText.textColor = UIColor.lightGray

    commentView.addSubview(commentText)

    promoView.frame = CGRect(x:0,y:0, width:screenSize.width,height:40)
    promoView.backgroundColor = .clear
    promoView.alpha = 0.0
    contentView.addSubview(promoView)


    promoButton.frame = CGRect(x:5,y:0, width:promoView.frame.width-10,height:promoView.frame.height)
    promoButton.setTitle("Add a promo code", for: .normal)
    promoButton.backgroundColor = UIColor.burntOrange()
    promoButton.isUserInteractionEnabled = true
    promoView.addSubview(promoButton)


}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override func layoutSubviews() {
    super.layoutSubviews()

}

It looks like there might be two issues going on.

First, your cell has a bunch of overlapping controls and you're trying to control which is used by setting the alpha. But cells can be reused, so you need to not only set the alpha to 1 for the controls to be shown, but you also need to set the alpha of the other controls back to 0 .

Second, it looks like each of the different configuration of subviews requires a different cell height. Perhaps you have code that sets the row heights that you haven't shared with us, but I wouldn't be surprised if you have some cells whose subviews are exceeding the height of the cell, resulting in further overlapping. Maybe this isn't a problem here, but it's a common hassle when you have a one cell type trying to service a variety of configurations.

I'd suggest simplifying this, having a different cell type (and different cell identifier) for each. And if you implement these as different cell prototypes, you not only don't have to do this programmatically, but you also completely get out of this mess of playing around with cell heights, alphas, etc. The idea is that you have different cell prototypes for each type of cell. You can design the cells like you want them right in IB, excise a bunch of this code, and life is much easier.

When a cell is dequeued for reuse, the content of its subviews are not cleared out.

Try clearing out the content before setting them in your cellForRowAt method

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell: BasketTableCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BasketTableCell
    cell.productName.text = ""
    cell.productPrice.text = ""
    etc..
    return cell

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM