【问题标题】:Table View Cell Reloading Issue表视图单元格重新加载问题
【发布时间】:2015-04-18 05:28:18
【问题描述】:

我的聊天应用程序中有一个表格视图,其中包含登录到该应用程序的用户。这个应用程序在 Swift 中,表格视图嵌入在导航控制器中。我也在使用 Parse。

当我点击用户时,它会将我发送到它应该执行的聊天屏幕。然后,当我单击“后退”按钮时,它会将我带回到应有的用户表视图,但是发生了一些奇怪的事情。它有已登录的用户,但显示了两次。例如,如果 User1 登录到应用程序,我单击它进行聊天,然后返回表格视图,它现在显示 User1 两次。如果我重复这个过程,它会显示 User1 三次。希望有人可以帮助...

变量:

 import UIKit

   // Global Variable 
   var userName = ""

class usersVC: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var resultsTable: UITableView!

var resultsUsernameArray = [String]()
var resultsProfileNameArray = [String]()
var resultsImageFile = [PFFile]()

override func viewDidLoad() {
    super.viewDidLoad()

    let theWidth = view.frame.size.width
    let theHeight = view.frame.size.height

    resultsTable.frame = CGRectMake(0, 0, theWidth, theHeight-64)

    // PFUser.currentUser().username is part of Parse framework
    userName = PFUser.currentUser()!.username!

}

然后这是我认为问题所在的 viewDidAppear:

    override func viewDidAppear(animated: Bool) {

    let predicate = NSPredicate(format: "username != '"+userName+"'")
    var query = PFQuery(className: "_User", predicate: predicate)
    var theObjects = query.findObjects()
        for object in theObjects! {

        // object.username is the name of the username class in Parse, as well as "profileName" and "photo"
        self.resultsUsernameArray.append(object["username"] as! String)
        self.resultsProfileNameArray.append(object["profileName"] as! String)
        self.resultsImageFile.append(object["photo"] as! PFFile)

        self.resultsTable.reloadData()

    }



}

不确定是否需要这样做,但它有一些相同的变量并处理表格视图:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell : ResultsCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! ResultsCell

    cell.usernameLbl.text = self.resultsUsernameArray[indexPath.row]
    cell.usernameLbl.hidden = true

    cell.profileNameLbl.text = self.resultsProfileNameArray[indexPath.row]


    resultsImageFile[indexPath.row].getDataInBackgroundWithBlock {

        (imageData: NSData?, error: NSError?) -> Void in

        if error == nil {

            let image = UIImage(data: imageData!)
            cell.profileImg.image = image
        }
    }

    return cell

}

如果需要更多代码,请告诉我!

谢谢你, 杰克

【问题讨论】:

  • 为什么在 viewDidAppear 中有那个代码?为什么不把它放在只运行一次的 viewDidLoad 中呢?
  • 我正在看一个视频,他们建议这样做。我会尝试将其放入 viewDidLoad 中,看看会发生什么。
  • 成功了!并迅速出现。再次感谢 rdelmar!

标签: ios uitableview swift pfquery


【解决方案1】:

你应该像这样改变你的viewDIdAppear()方法,

override func viewDidAppear(animated: Bool) {
    let predicate = NSPredicate(format: "username != '"+userName+"'")
    var query = PFQuery(className: "_User", predicate: predicate)
    var theObjects = query.findObjects()
    self.resultsUsernameArray.removeAll(keepCapacity: true)
    self.resultsProfileNameArray.removeAll(keepCapacity: true)
    self.resultsImageFile.removeAll(keepCapacity: true)
    for object in theObjects! {

        // object.username is the name of the username class in Parse, as well as "profileName" and "photo"
        self.resultsUsernameArray.append(object["username"] as! String)
        self.resultsProfileNameArray.append(object["profileName"] as! String)
        self.resultsImageFile.append(object["photo"] as! PFFile)

        self.resultsTable.reloadData()

    }
}

HTH,享受编码!

【讨论】:

  • 这样也行!谢谢你。我确实注意到,与将其放入 viewDidLoad() 相比,以这种方式显示确实需要更长的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多