2017-05-31 52 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

相关问题