2017-05-31 8 views
0

私のアプリケーションには、追加ボタンがあり、クリックすると新しいtableviewcellが追加されます。しかし、問題は私が最初に後に重複した細胞を取得しているということです。 Screen 1初めてテーブルビューセルを複写する

上記の画像は、最初の画面である:基本的に、私はスクリーンショットのための画像を参照してください....ように、私は二度目をクリックすると、第三に3、2、重複を取得しています。 「+」をクリックすると、下の画像のように見える新しいセル、追加されます:私はこのビューの外に行くと戻ってきた場合、保存した後、今 Screen 3:after save

Screen 2: Create cell

を今、再び追加して作成]をクリック新しいセル、それは私に上記の段落で言及された重複を与えます(つまり、2回目は2回目、3回目は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

警告を表示警告の表示okアクション。 –

+0

Firebase DBは問題ありませんか? –

+0

はい、firebase DBは正常に動作しています。 – BizDev

答えて

0

下記の手順:

  1. you'rはfirebase DBからデータを取得し、最初のyou'rはcellForRow方法で使用しているすべてのオブジェクトあなたのアレイを削除します。あなたの場合、私はそれがバケツの配列(はっきりしない)でなければならないと思う。あなたのオブジェクト

  2. リロードテーブルビューに

  3. 割り当てデータ。

データの複製の理由。

バケットに2つの値があり、それはDBに格納されます。 DBからデータを取得すると、すべての値、つまり1,2,3が得られます。これであなたの配列は1,2,1,2,3になります。

あなたのケースで何が起こっているのですか。

+0

私はこの部分を変更する必要がありますか? func tableView(_ tableView:UITableView、cellForRowAt indexPath:IndexPath) - > UITableViewCell { cell = tableView.dequeueReusableCell(withIdentifier: "webbasketcell"、for:indexPath)を次のようにします。 WebbasketcellTableViewCell 場合BasketItemList.count> 0 { basketitem = self.BasketItemListせ[(NSIndexPathとしてindexPath)を.row] cell.label.text = basketitem.basketname } 戻りセル – BizDev

+0

} BasketItemListは何ですか? –

+0

これは、作成しているセルのリストです。また、私が外に出て戻ってくると、重複した値が消えることに注意してください。これはリフレッシュの問題かもしれないと思いますか? – BizDev

関連する問題