【问题标题】:Rows overwriting each other in UITableview SwiftUITableview Swift中的行相互覆盖
【发布时间】:2017-04-30 10:52:12
【问题描述】:

My applications paymentWindow

嘿,我在 Swift 3.0 中的 UITableView 遇到了一些问题,当我滚动时,这些问题会覆盖我的页面设置。

我正在使用自定义 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()

}

【问题讨论】:

    标签: swift uitableview cocoa-touch reload


    【解决方案1】:

    当一个单元格出列以供重用时,其子视图的内容不会被清除。

    在您的 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
    

    【讨论】:

    • 嗨拉扎,感谢您的回答。是否可以关闭 UITableView 的重用?因为我将单元格用作用户的静态信息。
    • @Joachimdj - 你不能直接调用dequeueReusableCell 而是每次都重新实例化一个新的自定义单元格。或者,更好的是,为每种不同类型的单元格类型赋予其自己的单元格标识符。
    • 谢谢,我会试试的:)
    【解决方案2】:

    看起来可能存在两个问题。

    首先,您的单元格有一堆重叠的控件,您试图通过设置 alpha 来控制使用哪个控件。但是单元格可以重复使用,因此您不仅需要将 alpha 设置为 1 以显示控件,还需要将其他控件的 alpha 设置回0

    其次,看起来每个不同的子视图配置都需要不同的单元格高度。也许您的代码设置了您尚未与我们共享的行高,但如果您有一些单元格的子视图超出单元格的高度,从而导致进一步重叠,我不会感到惊讶。也许这在这里不是问题,但是当您有一个单元类型尝试为各种配置提供服务时,这是一个常见的麻烦。

    我建议简化这一点,为每个使用不同的单元格类型(和不同的单元格标识符)。如果您将它们实现为不同的单元原型,您不仅不必以编程方式执行此操作,而且您还可以完全摆脱与单元高度、alpha 等有关的混乱局面。这个想法是您有不同的单元每种类型的细胞的原型。您可以在 IB 中按照您想要的方式设计单元格,删除一堆这样的代码,生活就轻松多了。

    【讨论】:

    • 嗨,Rob,感谢您的澄清。我会试试的。这是否也可以解决我的屏幕截图中显示的单元格相互重叠的问题?
    • 是的,如果你正确设计了原型细胞,应该可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多