2015-07-20 2 views
0

Я пытаюсь получить имя Клиента, являющегося владельцем Vitrine.
Не удается получить доступ к атрибутам PFRelation

Вот мой код.
Чтобы сохранить данные, которые я делаю это:

self.vitrine["username"] = PFUser.currentUser()?.username 
    self.vitrine["name"] = nameTextField.text as String 
    var relation = self.vitrine.relationForKey("client") 
    relation.addObject(self.client) 

    self.vitrine.saveEventually { (success, error) -> Void in 

     if(error == nil){ 



     }else{ 

      println(error?.userInfo) 

     } 

     self.fetchAllVitrines() 

    self.navigationController?.popToRootViewControllerAnimated(true) 
    } 
} 

И это работает. В Parse я вижу, что отношение работает.

Я пытаюсь получить доступ к данным по отношению как это сделать:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = self.tableView.dequeueReusableCellWithIdentifier("vitrineCell", forIndexPath: indexPath) as! VitrineTableViewCell 

    var object: PFObject = self.vitrineObjects.objectAtIndex(indexPath.row) as! PFObject 

    cell.nomeLabel.text = object["name"] as? String 
    let x: PFRelation = object["client"] as! PFRelation 
    // cell.clientNameTextView.text = object["client"]["name"] as String 

    return cell 
} 

Но когда я вхожу данные в столбце клиента является то, что кажется мне:
<PFRelation: 0x7b7f1390, 0x7b7cfdc0.client -> Client>

Пожалуйста, кто помогает меня. Я нахожусь на этом в течение 2 дней. Я читал более трех раз в Parse Doc. и я не нахожу способ сделать это.

С уважением, Диого АМАРАЛ


Ну, я добавить код:

query!.getFirstObjectInBackgroundWithBlock { 
    (object: PFObject?, error: NSError?) -> Void in 

    if error != nil || object == nil { 

     println("The getFirstObject request failed.") 

    } else { 

     println(object) 
     cell.clientNameTextView.text = object["name"] as? String 

    } 

} 

Но линия: cell.clientNameTextView.text = object["name"] as? String бросает мне ошибку. «Невозможно присвоить значение типа« String »? к значению типа "Струнный!» ...

Я уже пробовал:
cell.clientNameTextView.text = object["name"] as! String cell.clientNameTextView.text = object["name"] as String cell.clientNameTextView.text = object["name"] as? String

Как я могу исправить это?

ответ

0

Если вы используете отношение (а не указатель), вам необходимо знать, что отношения хранят массивы их целевых объектов. Таким образом, при выполнении

вы добавляете self.client в массив client с. Если у витрины может быть только один владелец, и это должно быть сохранено в поле клиента, тогда вы, вероятно, захотите использовать указатель, а не ссылку.

Из-за этого массива ваш код, как написано, не будет работать. Вам нужно получить отношение от объекта vitrine, запросить его, извлечь элемент из требуемого массива, а затем вы можете его использовать.

let x: PFRelation = object["client"] as! PFRelation 
let query = x.query() 
// Lets say that you are only interested in the first element in your array... 
query.getFirstObjectInBackgroundWithBlock { first, error in 
    // Should do error checking here 
    cell.clientNameTextView.text = first!.objectForKey("name") as? String 
} 

Этот метод также немного неэффективен. Вы должны использовать некоторую форму кэширования или, в идеале, определить, действительно ли вам нужно использовать Relation или если указатель будет достаточным. Если указатель будет делать, вы также можете включить данные, на которые он указывает, когда вы запускаете исходный запрос с помощью метода includeKey на PFQuery. Вы не можете использовать includeKey для связи.

+0

@DiogoAmaral Я обновил код примера, чтобы обработать опциональность первого объекта и лить в String. – rickerbh

Смежные вопросы