2014-04-12 4 views
0

Так что это моя первая работа с синтаксисом. У меня есть простое приложение, которое создает пользователя и позволяет им войти. Я сейчас работаю над чем-то, что позволит им заполнить детали о себе, используя PFObjects, у меня нет проблем с этим. Моя проблема в том, что мне нужно распечатать данные пользовательских данных на UILabel.Parse Set Object To 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"); 
     } 
    }]; 

} 

ответ

2

Похоже, вы устанавливаете PFObject «имя» для self.name.text, но в вашем PFQuery вы запрашиваете класс и просить значений, где «имя» равна [PFUser currentUser]. Вы устанавливаете значение один путь, а затем используете совершенно другое значение в попытке запросить объект; поэтому getFirstObjectInBackgroundWithBlock не возвращает объект, так как нет объекта профиля, где «имя» равно [PFUser currentUser].

Я думаю, что вы путаете ваше "имя" и "автор" свойства ...


Edit (в ответ на ваш комментарий):

ОК, так что в saveProfile: вы создавая PFObject, где вы устанавливаете «имя» в строку имени и «автор» на объект PFUser пользователя. Когда вы используете whereKey: для выполнения запроса этого класса в попытке получить объект с помощью getFirstObjectInBackgroundWithBlock:, результат, возвращаемый вам, будет полностьюPFObject, где объект, связанный с ключом, указан в whereKey: критерии. Поэтому вам не нужно указывать, какой ключ PFObject вы хотите прочитать перед выполнением getFirstObjectInBackgroundWithBlock:. Запрос возвращает всех объекта - имя, автор и т.п.

Поэтому для того, чтобы получить доступ к возвращенному „имени“ PFObject «s в блоке запроса, изменениях:

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

к (dispatch_aync добавлено, чтобы заставить изменение этикетки на основную нить):

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

Я сейчас немного смущен всем происходящим, ха-ха. Я успешно создаю «имя», а автор - указатель на пользователя, создавшего «имя». Поэтому я хочу, чтобы «имя» этого конкретного пользователя распечатывалось. – Jack

+0

Хорошо, вижу. Я объясню, как это сделать. Одну секунду. –

+0

Я изменил 'self.nameLabel.text = объект [@" name "];' но имя по-прежнему не отображается на моем ярлыке. – Jack

1

этой линия

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

работает только в том случае, если столбец «name» является указателем или отношением к классу User. Если это имя пользователя вы после этого, вы должны использовать

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

Но почему вы запрашивая объект, который вы только что сохранили?

Ваш последний, обновленный пример должен работать для ваших нужд.

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], так что вы будете иметь всю информацию о пользователе в одном месте и назовите его там, где это необходимо.