将设置对象解析为UILabel

时间:2014-04-12 23:57:58

标签: ios objective-c uilabel parse-platform

所以这是我第一次使用parse我有一个简单的应用程序,它创建了一个用户并允许他们登录。我目前正在开发一些东西,允许他们使用PFObjects填写自己的详细信息,我不知道这有问题。我的问题是我需要在UILabel上打印用户特定数据。

这是我创建PFObject的代码,这很好用:

- (IBAction)saveProfile:(id)sender {
    PFObject *profile = [PFObject objectWithClassName:@"Profile"];
    [profile setObject: self.name.text forKey:@"name"];
    [profile setObject:[PFUser currentUser] forKey:@"author"];
    [profile saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) {
            NSLog(@"No Error");
        }else NSLog(@"Yeah you got an error bro");
    }];


}

以下是我对PFQuery的问题:

PFQuery *query = [PFQuery queryWithClassName:@"Profile"];
    [query whereKey:@"name" equalTo:[PFUser currentUser]];
    [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
        if (!error) {
            NSLog(@"Success");
            self.nameLabel.text = [NSString stringWithFormat:@"%@", query];
        }
        else {
        NSLog(@"Fail");
        }
    }];
}

所以基本上我希望用户输入他们的名字并保存,并在标签上打印出特定用户的名字。这是我得到的,如果你有任何建议,我会全力以赴。谢谢!

更新:

PFQuery *query = [PFQuery queryWithClassName:@"Profile"];
    [query whereKey:@"author" equalTo:[PFUser currentUser]];
    [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
        if (!error) {
            NSLog(@"Success");
            self.nameLabel.text = object[@"name"];
        }
        else {
        NSLog(@"Fails");
        }
    }];

}

3 个答案:

答案 0 :(得分:2)

您似乎正在设置PFObject"名称" self.name.text的关键,但是在你的PFQuery中,您要查询课程并询问值" name"等于[PFUser currentUser]。您尝试以一种方式设置值,然后使用完全不同的值来尝试查询对象;所以getFirstObjectInBackgroundWithBlock没有返回一个对象,因为没有Profile对象,其中" name"等于[PFUser currentUser]

我认为你混淆了你的名字"和"作者"属性...


编辑(回复您的评论):

好的,所以在saveProfile:您正在创建一个PFObject,您需要设置" name"到名称字符串和"作者"到用户的PFUser对象。当您使用whereKey:对此类执行查询以尝试使用getFirstObjectInBackgroundWithBlock:检索对象时,返回给您的结果将是完整 PFObject其中与密钥关联的对象是whereKey:条件中指定的对象。因此,在执行getFirstObjectInBackgroundWithBlock:之前,您不必指定要阅读的PFObject的哪个键。查询返回整个对象 - 名称,作者等

因此,为了访问返回的PFObject"名称"在查询块中,更改:

self.nameLabel.text = [NSString stringWithFormat:@"%@", query];

to(dispatch_aync添加强制标签更改到主线程上):

dispatch_async(dispatch_get_main_queue(),^{
    self.nameLabel.text = object[@"name"];
});

答案 1 :(得分:1)

这一行

[query whereKey:@"name" equalTo:[PFUser currentUser]];

仅在“name”列是User类的指针或关系时才有效。如果是您所使用的用户名,则需要使用

[query whereKey:@"name" equalTo:[PFUser currentUser][@"username"]];

但是你为什么要查询刚刚保存的对象?

您上次更新的示例应该可以满足您的需求。

答案 2 :(得分:0)

您可以启动类似下面的查询

PFQuery *query = [PFQuery queryWithClassName:@"Profile"];

NSString *nameStr = [NSString stringWithFormat:@"%@",[[PFUser currentUser]objectForKey:@"name"]];

[query whereKey:@"name" containsString:nameStr];

[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error)
{

  if (!error)
  {             
    /*object contains all columns and you need only key to obtain value*/

   nameLabel = [NSString stringWithFormat:@"%@",object[@"job"];
   .
   .
   .
 }
 else
 {
   NSLog(@"Error: %@", [error localizedDescription]);
 }
}];

现在您将拥有当前用户的对象及其所有详细信息。此外,您可以做一件事,即,在用户填写个人资料详细信息时,将其保存在字典中,如下所示:

NSDictionary *signupDetail = [NSDictionary dictionaryWithObjectsAndKeys:self.userRegisterTextField.text, @"username",
                               self.nameTextField.text, @"Name",
                               [ResponseDict objectForKey:@"sessionToken"] ,@"sessionToken",
                               [ResponseDict objectForKey:@"objectId"], @"objectId", 
                               nil];         
//ResponseDict is dictionary you get in response for successful signup.

然后您可以使用[NSUserDefaults standardUserDefaults]存储它,这样您就可以在一个地方获得用户的所有信息,并在需要的地方进行调用。