下拉刷新时 UITableview 出错,所有数据重复。任何人都可以帮助使用 Swift 3 , Xcode 8

Posted

技术标签:

【中文标题】下拉刷新时 UITableview 出错,所有数据重复。任何人都可以帮助使用 Swift 3 , Xcode 8【英文标题】:Error in UITableview when pull down to refresh, all data repeating itself. Can any one help using Swift3 , Xcode8 【发布时间】:2016-12-27 17:28:44 【问题描述】:

我的 UITableView 中有来自数据库的数据,当我尝试下拉以重复刷新我的 tableview 中的所有数据时,以及当我尝试将新数据放入数据库并进行刷新时没有任何反应。

这是我的代码

 class MyTable: UITableViewController 

   var refresh = UIRefreshControl()
   @IBAction func SharaOn(_ sender: UIButton) 
   
   var mydata = [TestTable]()
   let backendless = Backendless()

   override func viewDidLoad() 
   super.viewDidLoad()
   refresh = UIRefreshControl()
   refresh.addTarget(self, action: #selector (MyTable.pullDown), for: .valueChanged)

      tableView.addSubview(refresh)

      

    override func viewDidAppear(_ animated: Bool) 
         loaddatawithquery()
   


     override func numberOfSections(in tableView: UITableView) -> Int 
    // #warning Incomplete implementation, return the number of  sections
    return 1
     

     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
       // #warning Incomplete implementation, return the number of rows
       return mydata.count
      


     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

      if let cell = tableView.dequeueReusableCell(withIdentifier: "mycell") as? MyTableCell



        let ImgURL = URL(string : self.mydata[(indexPath as NSIndexPath).row].ImgURL!)
       let Desc = self.mydata[(indexPath as NSIndexPath).row].Desc!
        cell.MyText.text = Desc
        cell.mainImage.sd_setImage(with: ImgURL)

        return cell

       else

        let cell = MyTableCell()
        let ImgURL = URL(string : self.mydata [(indexPath as NSIndexPath).row].ImgURL)
         let Desc = self.mydata[(indexPath as NSIndexPath).row].Desc

        cell.mainImage.sd_setImage(with: ImgURL)

        cell.MyText.text = Desc!

        return cell
        


        


         func updateLikes() 
            let LikeBu = TestTable()
             let updaterecord =       Backendless.sharedInstance().data.of(TestTable.ofClass())


              LikeBu.LikeNo = 1
              updaterecord?.save(LikeBu, response:  (result) in
                  print("udateed successfully \(result)")
                   , error:  (Fault) in
                   print("EROrrrrrrrrrr")
               )


             
         func loaddatawithquery()


    _ = "ImgURL"
    _ = "Desc"
    let dataQuery = BackendlessDataQuery()
    dataQuery.queryOptions.pageSize=50

   // dataQuery.whereClause = whereClause

       backendless.data.of(TestTable.ofClass()).find(dataQuery,response: (result: BackendlessCollection?) -> Void in
         let data = result?.getCurrentPage()

    for obj in data! as! [TestTable] 

            self.mydata.append(obj)

        //print("&&&&&&&hhhjjjhhvkhkh \(obj.Desc!) &&&&&&&&&&&&&&&&&&")


        self.tableView.reloadData()


        
        ,
        error:  (fault: Fault?) -> Void in

let alert = UIAlertController(title: "info", message:"يرجى الاتصال بالانترنيت", preferredStyle: .alert)

alert.addAction(UIAlertAction(title: "OK", style: .default)  _ in

                                         )

self.present(alert, animated: true)


    )



@IBAction func likebutton(_ sender: AnyObject) 

   // updateLikes()




func pullDown() 


    for  data in mydata   

        self.mydata.append(data)
    

    self.refresh.endRefreshing()







 

【问题讨论】:

【参考方案1】:

据我所知,这是因为这里的代码

for  data in mydata   

    self.mydata.append(data)

这里实际上是在迭代tableview中的数据,并添加已经存在的数据,并获取新数据,因此在实际数组self.mydata中,有两组相似的对象。 我认为更好的方法是您可以在查询之后附加新数据,或者您可以清空数组然后从数据库中加载整个数据。

告诉我。

【讨论】:

我尝试这样做,但是当我在我的数据库中添加新数据并下拉时没有任何事情发生。 您现在使用的代码将追加新数据和旧数据,因此有两组旧数据,因此您在数组中得到重复数据。 你们是不是要删除 pulldown 的功能并使用 loaddatawithquery 的功能来代替它?如果是这个意思,我尝试这样做,但仍然是同样的错误。 不,在 pulldown 的 func 内部,而不是追加,调用具有更大页面大小的 func loaddatawithquery(更大的数组计数,您希望在 pull 后显示) 好的,我做到了,但仍然是同样的错误,所有数据都会再次自我重复。【参考方案2】:

你需要像这样更新你的代码:-

func pullDown() 

   var temp = [TestTable]()

    for  data in mydata   
        temp.append(data)
    
    mydata.removeAll()
    mydata = temp
    self.tableView.reloadData()
    self.refresh.endRefreshing()


【讨论】:

我这样做了,但仍然是同样的错误,当添加新数据并下拉时没有任何事情发生。 我已经编辑了我的答案,假设您在调用 pullDown 之前在 mydata 对象中有新数据。

以上是关于下拉刷新时 UITableview 出错,所有数据重复。任何人都可以帮助使用 Swift 3 , Xcode 8的主要内容,如果未能解决你的问题,请参考以下文章

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果

IOS怎么实现一个UITableView的下拉刷新

编程 .beginRefresh() 不刷新 UITableView 中的数据

UIRefreshControl:刷新时 UITableView '卡住'

如何添加拉表视图以刷新 uitableview 内的数据

下拉以使用静态单元格刷新 UITableView