簡體   English   中英

為什么相同的評論針對不同的用戶帖子顯示? (iOS,Swift,解析)

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

使用Swift(帶有Storyboard)和Parse在社交iPhone應用程序上工作,用戶可以在其中創建帖子並對類似於Facebook iOS應用程序和其他社交網絡應用程序的帖子發表評論。

該應用程序具有一個初始的主主頁Feed頁面 (顯示用戶帖子)和一個詳細的Reply頁面 (該頁面 顯示所選特定帖子的評論,但對不同帖子顯示相同的回復)。 兩者都使用PFTableViewController類,並且各自在單獨的swift文件中作為原型單元實現了自己的PFTableViewCell。

當用戶在“主頁供稿”頁面上點擊“任何帖子”單元格時,它將導航到“回復”頁面,但顯示該帖子的所有現有評論(以及每個新評論)。 當用戶從“主頁供稿”頁面中選擇特定帖子時,我試圖僅顯示特定帖子的評論。

知道為什么會這樣嗎? 非常感謝您的寶貴時間和幫助!

主頁Feed頁面:

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
}
}

在您的查詢中,您需要告訴目標ViewController要顯示回復的帖子。

將其添加到segue的底部(正是您的評論所在的位置):

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

並且在ReplyTableViewController您需要一個postObject變量,以便segue中的代碼起作用。 ReplyTableViewController的頂部放置:

var postObject = PFObject()

它看起來像postObject應該在什么地方使用PFQuery()過濾的答復,但我不熟悉它。

我找到了解決自己問題的方法!

我已經更新了Reply頁面,以使用UITableViewController而不是PFTableViewController並相應地更新了情節提要(我對代碼和情節提要進行了必要的更改,以遵守UITableViewController等的約束)。

我通過編寫類似於以下內容的方式實現了具有適當約束的PFQuery,以(僅)獲取給定帖子的所有答復:

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
   // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM