2015-05-06 1 views
0

У меня есть кнопка «Добавить пользователя», которая при нажатии кнопки устанавливает для объекта «статус» значение «Ожидание». Когда пользователь имеет это значение, я хочу обновить текст кнопки, чтобы сказать «Ожидание». С моим текущим решением текст автоматически изменяет каждую кнопку на «Ожидание», несмотря на мое строгий режим, чтобы менять кнопки, только если запрос соответствует «Ожидание». Что не так с моей логикой, которая меняет все кнопки в моем табло?Быстрое изменение состояния кнопки на основе запроса на парсер

Button State Logic:

var friendshipStatusQuery = PFQuery(className: "Follow") 

     friendshipStatusQuery.whereKey("status", equalTo: "Pending") 

     friendshipStatusQuery.findObjectsInBackgroundWithBlock { 
      (objects: [AnyObject]!, error: NSError!) -> Void in 
      if error == nil { 

       cell.addUserButton.setTitle("Pending", forState: UIControlState.Normal) 

      } else { 
       NSLog("Error: %@ %@", error, error.userInfo!) 
      } 
     } 

Полного код:

import UIKit 

class SearchUsersRegistrationTableViewController: UITableViewController { 

    var userArray : NSMutableArray = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var user = PFUser.currentUser() 

     loadParseData() 




    } 

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

    // MARK: - Table view data source 

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

     return 1 

    } 

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

     return userArray.count 

    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell: SearchUsersRegistrationTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SearchUsersRegistrationTableViewCell 

     let row = indexPath.row 

     var individualUser = userArray[row] as! PFUser 
     var username = individualUser.username as String 

     var profileImage = individualUser["profileImage"] as? PFFile 

     if profileImage != nil { 

     profileImage!.getDataInBackgroundWithBlock({ 
      (result, error) in 

      cell.userImage.image = UIImage(data: result) 

     }) 
     } else { 
      cell.userImage.image = UIImage(named: "profileImagePlaceHolder") 

     } 

     cell.usernameLabel.text = username 

     cell.addUserButton.tag = row 

     cell.addUserButton.addTarget(self, action: "addUser:", forControlEvents: .TouchUpInside) 


     var friendshipStatusQuery = PFQuery(className: "Follow") 

     friendshipStatusQuery.whereKey("status", equalTo: "Pending") 

     friendshipStatusQuery.findObjectsInBackgroundWithBlock { 
      (objects: [AnyObject]!, error: NSError!) -> Void in 
      if error == nil { 

       cell.addUserButton.setTitle("Pending", forState: UIControlState.Normal) 

      } else { 
       NSLog("Error: %@ %@", error, error.userInfo!) 
      } 
     } 


     return cell 

    } 

    func loadParseData() { 

     var user = PFUser.currentUser() 

     var query : PFQuery = PFUser.query() 

     query.whereKey("username", notEqualTo: user.username) 


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

      if error == nil { 

       if let objects = objects { 

        println("\(objects.count) users are listed") 

        for object in objects { 


         self.userArray.addObject(object) 



        } 
        self.tableView.reloadData() 
       } 
      } else { 
       println("There is an error") 
      } 
     } 
    } 






    @IBAction func addUser(sender: UIButton) { 

     println("Button Triggered") 

     let addUserButton : UIButton = sender as UIButton! 

     let user : PFObject = self.userArray.objectAtIndex(addUserButton.tag) as! PFObject 



     var follow = PFObject(className: "Follow") 



     follow["following"] = self.userArray.objectAtIndex(sender.tag) 
     follow["follower"] = PFUser.currentUser().username 
     follow["status"] = "Pending" 


     follow.saveInBackground() 


    } 

} 

ответ

0

То, что происходит, что запрос просит любой объекта в таблице Follow кто атрибут статуса == "Pending". Если один или несколько объектов в этой таблице удовлетворяют этому условию, то заголовок «Ожидание» будет применен ко всем кнопкам ячеек.

В коде есть две вещи. Сначала уточните запрос Follow, чтобы быть о текущей строке, возможно, что-то связано с атрибутом указателя в следующем объекте, равным userArray[row].

Во-вторых, ссылка на cell непосредственно в блоке завершения запроса будет иметь нежелательные эффекты, если пользователь прокручивает таблицу во время выполнения запроса. Эта ячейка будет снова использована для представления другой строки. Моя практика заключается в том, чтобы кэшировать результат запроса где-то (например, в массиве пользователя) и перезагружать строку в indexPath.

+0

Эй, спасибо за ответ. Когда вы указываете, что следующий объект должен быть равен userArray [row] в запросе, можете ли вы предоставить немного больше синтаксиса в это? Моя текущая мысль меняет запрос, если оператор 'findObjectsInBackgroundWithBlock' равен' if error == nil && cell.addUserButton.tag == indexPath.row', но я не уверен, что это то, что вы имели в виду. – cphill

+0

Это будет зависеть от модель данных и то, что должна представлять таблица, но скажем, что в таблице содержатся пользователи, которым может следовать текущий пользователь, и это указано атрибутом «followBy» в таблице Follow. Затем запрос должен задать whereKey: «followBy» isEqualTo: currentUser. – danh