为什么不同的用户帖子会显示相同的评论? (iOS, Swift, 解析)

Why are the same comments showing for different user posts? (iOS, Swift, Parse)

使用 Swift(带有故事板)和 Parse 开发社交 iPhone 应用程序,用户可以在其中创建 post 并评论 post,类似于Facebook iOS 应用程序和其他社交网络应用程序。

该应用有一个初始的主主页动态页面(显示用户posts)和一个详细的回复页面应该 显示选定的特定 post 的评论,但显示不同 post 的相同回复)。两者都使用 PFTableViewController class 并且每个都有自己的 PFTableViewCell 作为原型单元格在单独的 swift 文件中实现。

当用户点击主页页面中的任何 post 单元格时,它会导航到回复页面,但会显示 post 的所有现有评论(以及每条新评论)。当用户从“主页动态”页面选择特定 post 时,我试图只显示 特定 post 的评论。

知道为什么会这样吗?非常感谢您的宝贵时间和帮助!

动态主页:

class HomeTableVC: PFQueryTableViewController,CLLocationManagerDelegate {

  var posts: NSMutableArray! = NSMutableArray()

  override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
    return posts.count
  }

  override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
  }

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    self.performSegueWithIdentifier("showReplyViewController", sender: self)

  }

override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?, object: PFObject!) -> PFTableViewCell? {

    let cell = tableView!.dequeueReusableCellWithIdentifier("PostCell", forIndexPath: indexPath!) as! PostTableCell


    if let userPost : PFObject = self.posts.objectAtIndex(indexPath!.row) as! PFObject {

        cell.name.text = object["userName"] as? String
        cell.message.text = object["postMessage"] as? String
        let dateUpdated = object.createdAt! as NSDate
        let dateFormat = NSDateFormatter()
        dateFormat.dateFormat = "h:mm a"

        cell.dateTime.text =  NSString(format: "%@", dateFormat.stringFromDate(dateUpdated)) as String
        cell.message.numberOfLines = 0

        cell.message.text = userPost.objectForKey("postMessage") as? String
    }        

    return cell
}

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      if (segue.identifier == "showReplyViewController") {

        let indexPath = self.tableView.indexPathForSelectedRow

        let postObject = self.objects![indexPath!.row] as! PFObject

        //postObject (on LHS) is the PFObject declared in ResponseViewController
        if let destinationVC = segue.destinationViewController as? ReplyTableViewController {

            destinationVC.postObject = postObject
        }


      }
   }
}

回复页面:

class ReplyTableViewController: PFQueryTableViewController {

var postObject: PFObject?

var replies: NSMutableArray! = NSMutableArray()

override func viewDidAppear(animated: Bool) {

    super.viewDidAppear(animated)

    replies = NSMutableArray()

    var replyQuery = PFQuery(className: "Reply")

    replyQuery.addAscendingOrder("createdAt")

    replyQuery.findObjectsInBackgroundWithBlock {
    (objects: [AnyObject]?, error: NSError?) -> Void in

        if error == nil {

            for object in objects! {
                let reply: PFObject = object as! PFObject
                self.replies.addObject(reply)
            }

            let repliesArray: NSArray = self.replies.reverseObjectEnumerator().allObjects

            self.replies = NSMutableArray(array: repliesArray)

            self.tableView.reloadData()

        }
    }

}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {

    return replies.count
}

override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?, object: PFObject!) -> PFTableViewCell? {

  let cell = tableView!.dequeueReusableCellWithIdentifier("replyCell", forIndexPath: indexPath!) as! ReplyTableViewCell

  let replyObject: PFObject = self.replies.objectAtIndex(indexPath!.row) as! PFObject

  cell.replyMessageLabel.text = replyObject.objectForKey("replyMessage") as? String

  var queryUser: PFQuery = PFUser.query()!
    queryUser.whereKey("objectId", equalTo: (replyObject.objectForKey("replyUser")?.objectId)!)

  queryUser.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in

        if error == nil {

            let user: PFUser = (objects! as NSArray).lastObject as! PFUser
            cell.replyAuthorLabel.text = user.username
        }
  }

  return cell
}
}

在您的 segue 中,您需要告诉目的地 ViewController 要显示哪个 post 的回复。

将此添加到您的 segue 底部(正是您的评论所在的位置):

if let destinationVC = segue.destinationViewController as? ReplyTableViewController{
  destinationVC.postObject = postObject
}

而在 ReplyTableViewController 中,您需要一个 postObject 变量,以便 segue 中的代码能够正常工作。在 ReplyTableViewController 的顶部放置:

var postObject = PFObject()

看起来 postObject 应该在您的 PFQuery() 中的某处使用来过滤回复,但我不熟悉它。

我找到了解决我自己问题的方法!

我更新了回复页面以使用 UITableViewController 而不是 PFTableViewController 并相应地更新了情节提要(我在代码和情节提要中进行了必要的更改以符合 UITableViewController 等的约束)。

我实现了一个具有适当约束的 PFQuery 以获取给定 post(仅)的所有回复,方法是编写类似于以下内容的内容:

query.whereKey("parent", equalTo: aPost)

// Finds objects *asynchronously* and call the given block with the results.
query.findObjectsInBackgroundWithBlock {
  (objects: [AnyObject]?, error: NSError?) -> Void in

   // if there is no error, for each object in `objects`,
   // assign the given object to a PFObject
   // add the object to an array that will store all of the applicable replies for the post
   // ...
}