我想用NSFetchRequest的結果填充UIPickerView。然後將NSFetchRequest的結果存儲在一個NSArray中。我正在使用Core Data與SQLite數據庫進行交互。我有一個簡單的類文件,其中包含與我的項目中的故事板場景相關聯的UIPickerView。使用NSArray填充核心數據庫結果的uipicker視圖
該類的頭文件如下所示,
ViewControllerUsers.h
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
@interface ViewControllerUsers : UIViewController <NSFetchedResultsControllerDelegate, UIPickerViewDelegate, UIPickerViewDataSource>
{
NSArray *dictionaries;
}
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
// Core Data
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSArray *users;
@property (strong, nonatomic) IBOutlet UIPickerView *uiPickerViewUsers;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *btnDone;
@property (weak, nonatomic) IBOutlet UIButton *btnChangePin;
// added for testing purposes
@property (nonatomic, strong) NSArray *usernames;
- (IBAction)dismissScene:(id)sender;
- (IBAction)changePin:(id)sender;
@end
實現文件看起來像下面
ViewControllerUsers.m
#import "ViewControllerUsers.h"
@interface ViewControllerUsers()
@end
@implementation ViewControllerUsers
// Core Data
@synthesize managedObjectContext = _managedObjectContext;
@synthesize uiPickerViewUsers = _uiPickerViewUsers;
@synthesize usernames = _usernames;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
// Core Data
if (_managedObjectContext == nil)
{
_managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After _managedObjectContext: %@", _managedObjectContext);
}
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Account"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];
request.resultType = NSDictionaryResultType;
request.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"username"]];
request.returnsDistinctResults = YES;
_usernames = [_managedObjectContext executeFetchRequest:request error:nil];
NSLog (@"names: %@",_usernames);
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
//One column
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
//set number of rows
return _usernames.count;
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
//set item per row
return [_usernames objectAtIndex:row];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewDidUnload {
[self setBtnDone:nil];
[self setUiPickerViewUsers:nil];
[self setBtnChangePin:nil];
[super viewDidUnload];
}
- (IBAction)dismissScene:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
- (IBAction)changePin:(id)sender {
}
@end
當前代碼導致應用程序崩潰,但NSLog顯示NSArray中NSFetchRequest的結果。我目前認爲,如果我不得不猜測,我沒有正確格式化NSArray中NSFetchRequest的結果。
崩潰日誌看起來像下面,
2013年6月26日16:49:24.219 KegCop [41233:C07]名稱:( { 用戶名=等等; },{ 用戶名 =克里斯; },{ 用戶名 =根; } ) 2013年6月26日16:49:24.223 KegCop [41233:C07] - [NSKnownKeysDictionary1 isEqualToString:]:無法識別的選擇發送到實例0xe54d9a0 2013- 06-26 16:49:24.223 KegCop [41233:C07] 終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是: ' - [NSKnownKeysDictionary1 isEqualToString:]:無法識別的選擇發送到實例0xe54d9a0' 第一擲調用堆棧:
感謝隊友,感謝幫助。 – Chris