2015-11-02 4 views
0

У меня есть TableView подклассом как PFQueryTableViewController, и я хочу знать, как я могу получить список пользователей из Parse. У меня возникают проблемы с получением данных пользователей и их отображением с помощью моего кода. Есть ли что-то, что мне нужно изменить в моем запросеForTable, изменить синтаксический анализ или изменить код?Swift-Создание страницы профиля, например, Twitter или Instagram через PFQueryTableViewController

Вот мой ProfileViewController:

import UIKit 
import Parse 
import ParseUI 

class ProfileViewController: PFQueryTableViewController{ 

    var profilePosts:NSMutableArray! = NSMutableArray() 

    override init(style: UITableViewStyle, className: String!) { 
     super.init(style: style, className: className) 
    } 


    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     self.parseClassName = "Test" 
     self.textKey = "postMessage" 
     self.pullToRefreshEnabled = true 
     self.objectsPerPage = 200 

    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func queryForTable() -> PFQuery { 
     let query = PFQuery(className: "Test") 
     query.whereKey("username", equalTo: PFUser.currentUser()!) 
     query.limit = 200; 

     return query 
    } 

    // MARK: - Table view data source 

    override func objectAtIndexPath(indexPath: NSIndexPath!) -> PFObject? { 
     var obj : PFObject? = nil 
     if(indexPath.row < self.objects!.count){ 
      obj = self.objects![indexPath.row] as? PFObject 
     } 

     return obj 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return profilePosts.count 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath?, object:PFObject!) -> PFTableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("PCell", forIndexPath: indexPath!) as! ProfileCell 

     if let profilePost : PFObject = self.profilePosts.objectAtIndex(indexPath!.row) as! PFObject { 

      cell.NameProfile.text = object["account"] as? String 
      cell.messageProfile.text = object["postMessage"] as? String 
      let dateUpdated = object.createdAt! as NSDate 
      let dateFormat = NSDateFormatter() 
      dateFormat.dateFormat = "MMM d, h:mm a" 

      cell.timeProfile.text = NSString(format: "%@", dateFormat.stringFromDate(dateUpdated)) as String 
      cell.messageProfile.numberOfLines = 0 
      let likeScore = object[("count")] as! Int 
      cell.likeScoreProfile.text = "\(likeScore)" 
      let replyscore = object["replies"] as! Int 
      cell.replyScoreProfile.text = "\(replyscore) replies" 
      cell.messageProfile.text = profilePost.objectForKey("postMessage") as? String 
      if let profilePic = object["profilePhoto"] as? PFFile { 
       let imageView = cell.profilePhoto as PFImageView 

       imageView.image = UIImage(named: "profileImg") 
       imageView.file = profilePic 

       imageView.loadInBackground(nil) 
      } 


     return cell 
    } 

ответ

0

Вы никогда не назначаете profilePosts к objects, которые возвращаются из синтаксического анализа. У вас есть два варианта для этого. Один из них состоит в том, чтобы просто придерживаться реализации синтаксического анализа по умолчанию, которая позволяет использовать objects всякий раз, когда вам нужен один из ваших объектов базы данных. Другой должен придерживаться вашего массива profilePosts и назначить его в objectsDidLoad, что помешает вам изменить любой код, кроме этого. В противном случае в ваших методах, например numberOfRowsInSection, вам нужно будет вернуть objects!.count.

В случае, если вы решили использовать свой собственный массив profilePosts вы хотите сделать это:

import UIKit 
import Parse 
import ParseUI 

class ProfileViewController: PFQueryTableViewController{ 

var profilePosts:NSMutableArray! = NSMutableArray() 

override init(style: UITableViewStyle, className: String!) { 
    super.init(style: style, className: className) 
} 


required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    self.parseClassName = "Test" 
    self.textKey = "postMessage" 
    self.pullToRefreshEnabled = true 
    self.objectsPerPage = 200 

} 


override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

override func objectsDidLoad(error: NSError?) { 
    super.objectsDidLoad(error) 
    profilePosts = NSMutableArray(array: objects!) 
    self.tableView.reloadData() 
} 

override func queryForTable() -> PFQuery { 
    let query = PFQuery(className: "Test") 
    query.whereKey("username", equalTo: PFUser.currentUser()!.username) 
    query.limit = 200; 

    return query 
} 

// MARK: - Table view data source 

override func objectAtIndexPath(indexPath: NSIndexPath!) -> PFObject? { 
    var obj : PFObject? = nil 
    if(indexPath.row < self.profilePosts.count){ 
     obj = self.profilePosts[indexPath.row] as? PFObject 
    } 

    return obj 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return profilePosts.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath?) -> PFTableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("PCell", forIndexPath: indexPath!) as! ProfileCell 

    if let object : PFObject = self.profilePosts.objectAtIndex(indexPath!.row) as? PFObject { 

     cell.NameProfile.text = object["account"] as? String 
     cell.messageProfile.text = object["postMessage"] as? String 
     let dateUpdated = object.createdAt! as NSDate 
     let dateFormat = NSDateFormatter() 
     dateFormat.dateFormat = "MMM d, h:mm a" 

     cell.timeProfile.text = NSString(format: "%@", dateFormat.stringFromDate(dateUpdated)) as String 
     cell.messageProfile.numberOfLines = 0 
     let likeScore = object[("count")] as! Int 
     cell.likeScoreProfile.text = "\(likeScore)" 
     let replyscore = object["replies"] as! Int 
     cell.replyScoreProfile.text = "\(replyscore) replies" 
     cell.messageProfile.text = profilePost.objectForKey("postMessage") as? String 
     if let profilePic = object["profilePhoto"] as? PFFile { 
      let imageView = cell.profilePhoto as PFImageView 

      imageView.image = UIImage(named: "profileImg") 
      imageView.file = profilePic 

      imageView.loadInBackground(nil) 
     } 


    return cell 
} 

Обратите внимание, как я изменил cellForRowAtIndexPath использовать объект, который вы получали от profilePosts, а затем, как я overrode objectsDidLoad и присвоил PFQueryTableViewobjects собственности на ваш profilePosts массив. Одна из причин, по которой вы, возможно, захотите это сделать, состоит в том, что, имея собственную управляемую копию объектов Parse, вы можете выполнять такие вещи, как вставка или удаление с анимацией, которые не позволяют вам выполнять обычное свойство objects. Надеюсь, это поможет вам, дайте мне знать, если у вас появятся дополнительные вопросы.

EDIT 2 В свете Вашего комментария о вашем более конкретном вопросе, я хотел бы предложить вам изменить ваш первоначальный вопрос, чтобы указать, что вы спрашиваете о том, как получить только объекты текущего пользователя, а не о том, реализации использовать. Однако я оставляю этот код выше, потому что метод queryForTable был изменен, чтобы показать, что вам нужно сделать, чтобы удовлетворить ваши запросы. Он также показывает те, которые приходят, глядя, как правильно извлекать объекты, если у них возникают проблемы.

+0

Данные текущего пользователя не отображаются. Как это извлекает текущие объекты пользователей из объекта? – Cooni

+0

Вы используете оба объекта, хранящиеся в 'PFTableViewController', который представляет объекты, полученные из Parse, но вы также используете' profilePosts', который представляет собой массив, который, по вашему мнению, должен использоваться для представления ваших объектов Parse, но что вы никогда никому не назначаете. Таким образом, ваши варианты - либо ** только ** использовать свойство 'objects', которое у вас уже есть, либо изменить код для использования только' profilePosts', который вам придется назначать в 'objectsDidLoad' – pbush25

+0

@Cooni также обновил мои ответьте, чтобы дать вам лучшее представление о том, о чем я говорил. – pbush25