来自Parse对象的UIPickerView数据

时间:2015-03-31 00:39:58

标签: ios parse-platform uipickerview

在我的应用中,我正在显示一个选择器视图,让用户选择一个对象来填充文本字段。 当用户更改选择器行时,文本字段应显示选取器行的标题,但它不会始终发生。 这是从Parse获取源对象的代码:

PFQuery *query = [PFQuery queryWithClassName:@"menu_categories"];
[query whereKey:@"category_restaurant" equalTo:restauranteID];
[query orderByDescending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        _pickerData = objects;

        for (int i =0; i< [objects count];i++)
        {

            NSString *textoactual = self.menu_item_category_textfield.text;
            if ([[[objects objectAtIndex:i] objectForKey:@"category_name"]
                 isEqualToString:textoactual])
            {
                [self.room_picker reloadAllComponents];
                [self.room_picker selectRow:i inComponent:0 animated:YES];
                break;

            }

        }

    }
    else {
        NSLog(@"error");
    }
} ];

我正在使用for语句使得首次显示的选择行与文本字段内容相同。这很好。 但是稍后如果用户更改了选择器行,那么应该显示为文本域文本的行标题名称不会正确更改,有时会这样做,但有时却不会。

这些是已实现的选择器视图委托方法:

- (int)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}



// The number of rows of data
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return _pickerData.count;
}


- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    PFObject *object = _pickerData[row];

    self.menu_item_category_textfield.text = object[@"category_name"];
    return object[@"category_name"];



}


-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
      inComponent:(NSInteger)component
{



}

我应该更改什么才能获得所需的行为,这意味着始终将选定的选择器视图行标题显示为文本字段中的文本?

编辑:

enter image description here enter image description here enter image description here

1 个答案:

答案 0 :(得分:2)

由于您在viewDidLoad中执行查询,这是为NSArray创建UIPickerView的好地方,因此可确保将其加载到内存中。我的猜测是每次调用PFObject时都会创建一个新的titleForRow:,这会在翻译中丢失。

因此强制将_pickerData加载到内存中:

-(void)viewDidLoad {
    PFQuery *query = [PFQuery queryWithClassName:@"menu_categories"];
    [query whereKey:@"category_restaurant" equalTo:restauranteID];
    [query orderByDescending:@"createdAt"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            _pickerData = [objects valueForKey:@"category_name"];
....
}

然后你需要在titleForRow:中完成所有工作:

- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return self.pickerData[row];
}

当您选择它时,您应该在titleForRow:

中执行附加
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
     self.menu_item_category_textfield.text = self.pickerData[row];
}
相关问题