来自 Parse objects 的 UIPickerView 数据

UIPickerView data from Parse objects

在我的应用程序中,我显示了一个选择器视图,让用户 select 一个 object 来填充文本字段。 当用户更改选择器行时,文本字段应显示选择器行的标题,但并非总是如此。 这是从 Parse 获取源 objects 的代码:

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
{



}

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

已编辑:

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

所以强制将你的 _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];
}

而当你 select 那就是你应该在 titleForRow:

中添加 而不是 的时候
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
     self.menu_item_category_textfield.text = self.pickerData[row];
}