来自 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];
}
在我的应用程序中,我显示了一个选择器视图,让用户 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];
}