2017-05-31 43 views
0

在我的應用程序中,有一個添加按鈕,單擊時會添加一個新的tableviewcell。但問題是我第一次獲得重複的單元格。從本質上講,當我點擊第二次時,我得到2個副本,第三個3等....請參閱圖像的屏幕截圖: Screen 1第一次獲取重複的tableview單元格

上面的圖像是第一個屏幕。點擊「+」將增加一個新的細胞,它看起來像下面的圖片:在保存後 Screen 2: Create cell

現在, Screen 3:after save

現在,如果我走了這一觀點,並回來,再次單擊添加和創建一個新的單元格,它給了我上面段落中提到的重複內容(即,第二次是2,第三次是3,等等)。 下面是截圖:enter image description here

這裏是我使用的代碼:

@IBAction func addBasket(_ sender: UIButton) { 

    let prefs   = UserDefaults.standard 
    let status  = prefs.string(forKey: "status") 

    if(status != nil){ 

     if(status == "pending"){ 

      if(BasketItemList.count < 5) { 

       self.addpost() 

      } else { 


       let alert = SCLAlertView() 
       alert.showWarning("Basket", subTitle: "Upgrade to add more") 

      } 



     } else { 

      if(BasketItemList.count < 50) { 

       self.addpost() 

      } else { 

       let alert = SCLAlertView() 
       alert.showWarning("Basket", subTitle: "Upgrade to add more") 

      } 



     } 


    } 



} 


func addpost() { 

    let appearance = SCLAlertView.SCLAppearance(
     showCloseButton: false 
    ) 

    let alert = SCLAlertView(appearance : appearance) 
    let txt = alert.addTextField("Enter name") 
    alert.addButton("Save") { 

     if txt.text?.characters.count != 0 { 

      let basketname : String = txt.text! 

      let userID = FIRAuth.auth()?.currentUser?.uid 

      let postitem : [String :AnyObject] = ["userid" : userID! as AnyObject , "basketname" : basketname as AnyObject ] 

      let dbref = FIRDatabase.database().reference() 
      dbref.child("BasketList").childByAutoId().setValue(postitem) 

      self.Basketdata2() 



      let appearance = SCLAlertView.SCLAppearance(
       kDefaultShadowOpacity: 0, 
       showCloseButton: false 
      ) 

      let alertView = SCLAlertView(appearance: appearance) 
      alertView.showTitle(
       "Saved", // Title of view 
       subTitle: "", // String of view 
       duration: 2.0, // Duration to show before closing automatically, default: 0.0 
       completeText: "Done", // Optional button value, default: "" 
       style: .success, // Styles - see below. 
       colorStyle: 0xA429FF, 
       colorTextButton: 0xFFFFFF 
      ) 




     } else { 


      let alert = SCLAlertView() 
      alert.showError("Oops!", subTitle: "Basket name should not be empty") 

      self.tableviewbasket.reloadData() 

     } 

    } 
    alert.addButton("Cancel"){ 


    } 
    alert.showEdit("Add basket", subTitle: "Please enter your basket name") 




} 

func Basketdata2() { 
    HUD.show(.labeledProgress(title: "Loading...", subtitle: "")) 

    let databaseref = FIRDatabase.database().reference() 
    var userID = FIRAuth.auth()?.currentUser?.uid 

    if userID == nil { 

     userID = userfbid 
    } 

    databaseref.child("BasketList").queryOrdered(byChild: "userid").queryEqual(toValue: userID!).observeSingleEvent(of: .value, with: { (snapshot) in 

     if snapshot.exists() { 

      self.tableviewbasket.backgroundView = nil; 
      HUD.hide() 

     } else { 

      HUD.hide() 


      self.tableviewbasket.setContentOffset(CGPoint(x : 0, y: -98), animated: true) 


      if (self.BasketItemList.count == 0) { 

       // tableView is empty. You can set a backgroundView for it. 
       let label = UILabel(frame: CGRect(x: 5, y: 0, width: self.tableviewbasket.bounds.size.width, height:self.tableviewbasket.bounds.size.height)) 
       label.text = "The best preparation for tomorrow \n is doing your best today.\n Please create your first basket." 
       label.textColor = UIColor.black; 
       label.textAlignment = .center 
       label.numberOfLines = 4 
       label.sizeToFit() 
       label.font = UIFont(name: "AvenirNext-Regular", size: 16.0) 
       self.tableviewbasket.backgroundView = label; 
       self.tableviewbasket.separatorStyle = .none; 

      } 

     } 

    }) 
} 


    func Basketdata() { 

    HUD.show(.labeledProgress(title: "Please wait...", subtitle: "")) 

    self.BasketItemList.removeAll() 
    self.Basketid.removeAll() 

    let databaseref = FIRDatabase.database().reference() 
    let userID = FIRAuth.auth()?.currentUser?.uid 

    databaseref.child("BasketList").queryOrdered(byChild: "userid").queryEqual(toValue: userID!).observeSingleEvent(of: .value, with: { (snapshot) in 

     if snapshot.exists() { 

      databaseref.child("BasketList").queryOrdered(byChild: "userid").queryEqual(toValue: userID!).observe(.childAdded, with: { 
       (snapshot) in 



       if let dictionary = snapshot.value as? [String : AnyObject] { 


        let basketitem = BasketList(text : "") 
        basketitem.setValuesForKeys(dictionary) 

        self.BasketItemList.append(basketitem) 
        self.Basketid.append(snapshot.key) 
        DispatchQueue.main.async { 

         if !self.BasketItemList.isEmpty { 

          HUD.hide() 
          self.tableviewbasket.reloadData() 

         } 

        } 


       } else { 

        self.tableviewbasket.reloadData() 
        HUD.hide() 
       } 


      }) 




     } else { 

      if (self.BasketItemList.count == 0) { 

       // tableView is empty. You can set a backgroundView for it. 
       let label = UILabel(frame: CGRect(x: 5, y: 0, width: self.tableviewbasket.bounds.size.width, height:self.tableviewbasket.bounds.size.height)) 
       label.text = "The best preparation for tomorrow \nis doing your best today" 
       label.textColor = UIColor.black; 
       label.textAlignment = .center 
       label.numberOfLines = 2 
       label.sizeToFit() 
       label.font = UIFont(name: "AvenirNext-Regular", size: 16.0) 
       self.tableviewbasket.backgroundView = label; 
       self.tableviewbasket.separatorStyle = .none; 

      } 


      HUD.hide() 


     } 

    }) 




} 

有人可以幫助我瞭解什麼是錯我的代碼?謝謝!

編輯:我已經提到這個線程沒有任何的運氣:Getting duplicate cells with UITableViewController cellForRowAtIndexPath

編輯2:此外,當我走出這一觀點的,去了同樣的觀點,重複的值vansihed。

編輯3:沒有任何成功試過答案。

+0

添加警報顯示警告確定操作。 –

+0

您的Firebase數據庫可以嗎? –

+0

是的,firebase數據庫工作正常。 – BizDev

回答

0

遵循以下步驟:

  1. 當找你正從火力DB數據,首先刪除你的陣列找你的cellForRow方法使用的所有對象。在你的情況下,我認爲它應該是Bucket數組(不確定)。

  2. 數據分配給你的對象

  3. 重裝的tableview。

數據複製的原因。

讓你的存儲桶有2個值,它存儲在數據庫中。當你從數據庫中獲取數據時,它會給你所有的值,即1,2,3。現在你添加這些,現在你的數組將是1,2,1,2,3。

那就是你的情況發生了什麼。

+0

所以我需要在這部分做出改變? func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell {let} cell = tableView.dequeueReusableCell(withIdentifier:「webbasketcell」for:indexPath)as! WebbasketcellTableViewCell 如果BasketItemList.count> 0 { 讓basketitem = self.BasketItemList [(indexPath如NSIndexPath).row] cell.label.text = basketitem.basketname } 返回細胞 } – BizDev

+0

什麼是BasketItemList? –

+0

這是我們正在創建的單元格列表。另外,請注意,如果我離開視圖並返回,則重複值將消失。你認爲這可能是一個刷新問題? – BizDev

相關問題