0

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

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

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

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

主页 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
}
}
4

2 回答 2

0

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

我已经更新了回复页面以使用 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
   // ...
}
于 2015-11-24T04:05:40.120 回答
0

在您的 segue 中,您需要告诉目标 ViewController 显示回复的帖子。

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

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

而且ReplyTableViewController你需要一个postObject变量,以便 segue 中的代码工作。在您ReplyTableViewController看跌期权的顶部:

var postObject = PFObject()

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

于 2015-11-16T18:34:37.030 回答