Почему одни и те же комментарии отображаются для разных пользовательских сообщений? (iOS, Swift, Parse)
Работа над социальным приложением для iPhone с использованием Swift (с раскадровкой) и Parse, где пользователи могут создавать посты и комментировать посты, похожие на приложение Facebook для iOS и другие приложения для социальных сетей.
Приложение имеет начальную, главную страницу главной ленты (которая отображает сообщения пользователя) и подробную страницу ответа (которая должна отображать комментарии для определенного сообщения, которое было выбрано, но показывает одинаковые ответы для разных сообщений). Оба используют класс PFTableViewController, и каждый имеет свой собственный PFTableViewCell, реализованный в отдельных файлах swift в качестве ячеек прототипа.
Когда пользователь нажимает на ЛЮБУЮ ячейку сообщения на странице Home 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
}
}
2 ответа
Я нашел решение своей проблемы!
Я обновил страницу "Ответить", чтобы использовать 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
// ...
}
В своей теме вы должны указать целевому ViewController, для какой записи показывать ответы.
Добавьте это в конец вашей статьи (именно там, где находится ваш комментарий):
if let destinationVC = segue.destinationViewController as? ReplyTableViewController{
destinationVC.postObject = postObject
}
И в ReplyTableViewController
тебе необходимо postObject
переменная, так что код в segue работает. В верхней части вашего ReplyTableViewController
положил:
var postObject = PFObject()
Похоже, postObject
должен быть использован где-то в вашем PFQuery()
чтобы отфильтровать ответы, но я не знаком с этим.