UIPickerView 未填充从 CoreData 获取的数据
Posted
技术标签:
【中文标题】UIPickerView 未填充从 CoreData 获取的数据【英文标题】:UIPickerView is not populated with data fetched from CoreData 【发布时间】:2014-04-10 13:59:08 【问题描述】:所以这是我的问题。我正在尝试从 CoreData 获取值,我的数据表中有数据,因此我不明白为什么会发生这种情况。当我打开托管 UIPickerView 的视图时,没有数据存在。
下面是我的代码。
ViewController 标头:
#import <UIKit/UIKit.h>
@interface EBPaymentViewController : UIViewController <UIPickerViewDelegate>
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, strong) NSMutableArray *voucherTypes;
@property (weak, nonatomic) IBOutlet UIPickerView *voucherTypePicker;
@end
下面是我的 viewDidLoad
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
// load the data from the database and populate the UIPickerView.
EBAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
_managedObjectContext = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *vouchers
= [NSEntityDescription entityForName:@"VoucherTypes" inManagedObjectContext:_managedObjectContext];
[request setEntity:vouchers];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"voucherType" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:descriptor, nil];
[request setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[_managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if(mutableFetchResults == nil)
// handle error
[self setVoucherTypes:mutableFetchResults];
最后是我的 titleForRow:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
return [voucherTypes objectAtIndex:row];
UIPickerView 只是空的。任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:在您获取之后,您需要设置[myPicker setDataSource:self]
,然后从 UIPickerDataSource 协议实现方法 '[pickerView:numberOfRowsInComponent:]'
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
return [voucherTypes count];
【讨论】:
感谢 Rob 的帮助,这似乎奏效了。还有一个问题,如何设置 UIPickerView 以显示数组中对象的凭证类型属性。 很高兴它有效。要设置项目标签,您的 UIPickerViewDelegate 可以实现 pickerView:titleForRow:forComponent: 并为每一行返回您想要的任何属性。在这种情况下,我认为只需返回voucherType[row]
;但你已经在做对了吗?你有没有加过[myPicker setDelegate:self]
?该代码是否正在执行?你在看什么?
失败,出现 'NSInvalidArgumentException',原因:'-[NSManagedObject copyWithZone:]: unrecognized selector sent to instance 0x8ccbab0'
嗯。返回 [voucherTypes objectAtIndex:row];是您的托管对象之一——您想要做的是获取该对象的一些 NSString 属性,然后返回它!
改为:return [[voucherTypes objectAtIndex:row] couponType]; - 这应该根据方法的定义返回一个 NSSString,但是我得到的只是 UIPickerView 中的问号。以上是关于UIPickerView 未填充从 CoreData 获取的数据的主要内容,如果未能解决你的问题,请参考以下文章
如果 UIPickerView 未触及,则 UIPickerView 选择第 0 行