2013-06-26 133 views
0

我想用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' 第一擲調用堆棧:

回答

0

usernames陣列是一個字典數組,而不是一個字符串數組。

更新您的titleForRow:方法是這樣的:

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    //set item per row 
    return _usernames[row][@"username"]; 
} 
+0

感謝隊友,感謝幫助。 – Chris