2013-09-27 2 views
0

Я хочу получить записи из основного объекта данных и хочу, чтобы другие записи были введены против этого.ошибка при получении данных в uipickerview?

У меня есть две сущностей базовых данных Категории и продукт

я сделал их отношения, а также.

Я сделал с категорией часть.

сейчас я хочу добавить товары против выбранной категории.

для этого я использую UIPICKERVIEW, чтобы показать категорию, а затем ее сохранить в продукте.

Вот NSObject подкласс Product.h

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class Category; 

@interface Product : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSNumber * is_active; 
@property (nonatomic, retain) NSString * descript; 
@property (nonatomic, retain) Category *category; 

@end 

и .m файл

#import "Product.h" 
#import "Category.h" 


@implementation Product 

@dynamic name; 
@dynamic is_active; 
@dynamic descript; 
@dynamic category; 

@end 

Что я пытаюсь сделать, где показать сборщика.

IMSAddProductViewController.h

#import <UIKit/UIKit.h> 

@interface IMSAddProductViewController : UIViewController < UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate> 

@property (weak, nonatomic) IBOutlet UIPickerView *categoryPicker; 
@property (weak, nonatomic) IBOutlet UITextField *txtEnterName; 
@property (weak, nonatomic) IBOutlet UITextField *txtEnterDescription; 
@property (weak, nonatomic) IBOutlet UISwitch *txtIsActive; 

@property(nonatomic,retain)NSArray *arr; 
@property (readonly, strong, nonatomic) NSMutableArray *categoryArray; 

- (IBAction)btnSave:(id)sender; 

@end

я не знаю, что должно быть отредактирован здесь в этом коде, чтобы показать Picker записи ..

IMSAddProductViewController.m

#import "IMSAddProductViewController.h" 
#import "IMSAppDelegate.h" 
#import "Product.h" 
#import "Category.h" 

@interface IMSAddProductViewController() 
{ 

    NSManagedObjectContext *context; 
} 
@end 

@implementation IMSAddProductViewController 
@synthesize arr; 
@synthesize txtIsActive; 
@synthesize categoryArray; 
@synthesize txtEnterName; 
@synthesize txtEnterDescription; 


    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     IMSAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; 
     context = [appDelegate managedObjectContext]; 

     NSEntityDescription *category = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:context]; 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Category"]; 
     request.resultType = NSDictionaryResultType; 

     request.propertiesToFetch = [NSArray arrayWithObject:[[category propertiesByName] objectForKey:@"arr"]]; 


     NSError *error; 
     NSMutableArray *results = [[context executeFetchRequest:request error:&error] mutableCopy]; 
     if (results == nil) { 
      //error handle here 
     } 
     [self setArr:results]; 
      NSLog (@"name: %@",categoryArray); 
    } 

    - (NSInteger)numberOfComponentsInPickerView: 
    (UIPickerView *)pickerView 
    { 
     return 1; 
    } 

    - (NSInteger)pickerView:(UIPickerView *)pickerView 
    numberOfRowsInComponent:(NSInteger)component 
    { 
     // return _countryNames.count; 
     return arr.count; 
    } 

    - (NSString *)pickerView:(UIPickerView *)pickerView 
       titleForRow:(NSInteger)row 
       forComponent:(NSInteger)component 
    { 
     //return _countryNames[row]; 
     return arr[row]; 
    } 


    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row 
      inComponent:(NSInteger)component 
    { 
     categoryArray = [self.arr objectAtIndex:row]; 
    } 

, когда я иду к нему, он рассматривает это исключение

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 

'* - [__ NSPlaceholderArray initWithObjects: Кол-во:]: попытка вставить ноль объект из объектов [0]'.

+0

ли вы поставить точку останова в 'если это (результат == ноль) {// здесь ошибка здесь} ', чтобы убедиться, что все в порядке? – Larme

ответ

0

Согласно official documentation, вам необходимо установить resultType из NSFetchRequest до NSDictionaryResultType.
Включите эту опцию в viewDidLoad после request.propertiesToFetch:

request.returnsDistinctResults = YES; 
request.resultType = NSDictionaryResultType; 

Кроме того, замените

[self setArr:results]; 

с

NSArray* results2 = [resultsvalueForKeyPath:@"arra"]; 
[self setArr:results2]; 
+0

@property (слабый, неатомный) IBOutlet UIPickerView * categoryPicker; Puneet, вы видите, я не использовал эту вышерасположенную строку где бы то ни было, чтобы использовать это, потому что поместить некоторый код на это покажут результаты, которые я думаю –

+0

Сначала у вас должны быть выбранные значения. Вышеприведенный код выберет для вас. Затем вы должны настроить UIPickerViewDelegate на себя. Затем делегаты, которые вы установили, начнут выполнять свою работу. Используйте отладку, чтобы обеспечить получение объектов и значений, и методы делегирования вызываются. –

+0

запрос.propertiesToFetch = [NSArray arrayWithObject: [[category propertiesByName] objectForKey: @ "name"]]; Puneet Я отредактировал эту строку в поле зрения, загрузился также отредактировал это [self setArr: results]; NSLog (@ "name:% @", arr); –

Смежные вопросы