2016-12-14 32 views
0

My applications paymentWindow行中的UITableView斯威夫特

嘿,我有一些問題在雨燕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() 

} 

回答

0

看起來可能會出現兩個問題。

首先,你的單元格有一堆重疊控件,你試圖通過設置alpha來控制使用哪一個。但單元格可以重複使用,因此您不僅需要將alpha設置爲1來顯示控件,還需要將其他控件的alpha設置回0

其次,它看起來像子視圖的每個不同的配置需要不同的單元格高度。也許你有代碼設置你沒有與我們共享的行高,但是如果你有一些單元格的子視圖超過了單元格的高度,那麼我不會感到驚訝,導致進一步的重疊。也許這在這裏不是問題,但當你有一種單元類型試圖服務於各種配置時,這是一種常見的麻煩。

我建議簡化這一點,爲每個單元格類型(和不同的單元格標識符)。如果你將它們作爲不同的細胞原型來實現,你不但不需要以編程的方式來完成這個任務,而且你還完全擺脫了細胞高度,alpha等等的混亂。這個想法是你有不同的細胞每類細胞的原型。你可以像在IB中想要的那樣設計單元格,去掉一堆這樣的代碼,生活變得更容易。

+0

嘿羅布,感謝澄清。我會嘗試。這是否也可以解決單元格填充問題,如我的屏幕截圖所示? – Joachimdj

+0

是的,如果你正確設計原型單元,它應該解決這個問題。 – Rob

0

當一個單元出列重用時,其子視圖的內容不會被清除。

嘗試在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