Строки перезаписывают друг друга в UITableview Swift

Мои приложения paymentWindow

Эй, у меня есть некоторые проблемы с UITableView в Swift 3.0, которые перезаписывают настройки моей страницы, когда я прокручиваю.

Я использую пользовательский UITableViewCell для определения информации о строках.

Кто-нибудь знает эту проблему?

Моя текущая настройка выглядит следующим образом.

    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
    }

И клетка выглядит так.

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()

}

2 ответа

Когда ячейка исключается для повторного использования, содержимое ее подпредставлений не очищается.

Попробуйте очистить содержимое, прежде чем устанавливать их в своем cellForRowAt метод

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

Похоже, может быть две проблемы.

Во-первых, ваша ячейка имеет несколько перекрывающихся элементов управления, и вы пытаетесь контролировать то, что используется путем установки альфа. Но ячейки можно использовать повторно, поэтому вам нужно не только установить альфа на 1 для показа элементов управления, но вы также должны установить альфа других элементов управления обратно на 0,

Во-вторых, похоже, что каждая из различных конфигураций подпредставлений требует разной высоты ячейки. Возможно, у вас есть код, который устанавливает высоты строк, которыми вы не поделились с нами, но я не удивлюсь, если у вас есть несколько ячеек, чьи подпредставления превышают высоту ячейки, что приводит к дальнейшему перекрытию. Может быть, это не проблема, но это обычная проблема, когда у вас один тип ячейки, который пытается обслуживать различные конфигурации.

Я бы предложил упростить это, имея разные типы ячеек (и разные идентификаторы ячеек) для каждого. И если вы реализуете их как различные прототипы ячеек, вам не только не нужно делать это программно, но вы также полностью избавляетесь от этого беспорядка, играя с высотами ячеек, альфа и т. Д. Идея состоит в том, что у вас разные ячейки прототипы для каждого типа клеток. Вы можете создать ячейки так, как вы хотите, чтобы они были прямо в IB, вырезать кучу этого кода, и жизнь станет намного проще.

Другие вопросы по тегам