2016-12-14 3 views
0

My applications paymentWindowРяды перезапись друг друга в UITableView Swift

Эй у меня возникли некоторые проблемы с 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() 

} 

ответ

0

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

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

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

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

+0

Эй Роб, спасибо за разъяснение. Я попробую это. Будет ли это также устранять проблему с заполнением ячейки друг на друга, как видно на моем снимке экрана? – Joachimdj

+0

Да, если вы правильно спроектировали ячейки прототипа, он должен решить эту проблему. – Rob

0

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

Try очистки содержимого перед установкой их в методе 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 
+0

Эй, Раза, спасибо за ответ. Можно ли отключить повторное использование для UITableView? Потому что я использую ячейку как статическую информацию для пользователя. – Joachimdj

+0

@Joachimdj - Вы можете просто не называть 'dequeueReusableCell' и просто повторно создавать новую свою настраиваемую ячейку каждый раз. Или, лучше, дать каждому отдельному типу типа ячейки свой собственный идентификатор ячейки. – Rob

+0

Спасибо, я попробую это :) – Joachimdj

Смежные вопросы