2013-07-23 4 views
0

모든 스택 오버플로를 검색했지만 쉽게 대답 할 수는 없지만 실제로 문제가 해결되지 않았습니다.UIPickerView에 코어 데이터에서 가져온 데이터를 할당합니다.

문자열을 저장하는 엔티티가있는 앱이 있습니다. 나는 그것들을 저장하고 UITableView에서 그것들을 매우 잘 가져올 수있다. 그러나 어떤 점에서 그것들을 가져 와서 UIPickerView에 넣어야한다. 내 수업은 UIPickerView입니다. 모달 뷰에 있으므로 부모 뷰에서 데이터를 다시 가져올 대리자가 있지만 정상적으로 작동합니다. 헤더 파일 :

#import <UIKit/UIKit.h> 


@protocol TextChoiceDelegate <NSObject> 
- (void) takeBackViewController:(id)controller didFinishSelectingText:(NSString *)text; 
@end 

@interface ChooseTextViewController : UIViewController 
<UIPickerViewDelegate, UIPickerViewDataSource> { 
    UIPickerView *pickerView; 
    NSMutableArray *list; 
} 

@property (nonatomic, assign) id <TextChoiceDelegate> delegate; 
@property (strong, nonatomic) IBOutlet UIPickerView *pickerView; 
@property (strong, nonatomic) NSString *text; 

- (IBAction)didFinishChoosingText:(id)sender; 

@end 

그리고하는 .m 파일 : 나는 그것을이 오류 로그와 응용 프로그램의 충돌을 클릭하자마자 내가 이것을 실행하면

#import "ChooseTextViewController.h" 

@interface ChooseTextViewController() 
@property (strong) NSMutableArray *list; 
@end 


@implementation ChooseTextViewController 

@synthesize delegate; 

@synthesize pickerView; 
@synthesize list; 
@synthesize text; 


#pragma mark - IBActions 

- (IBAction)didFinishChoosingText:(id)sender 
{ 
    NSString *textToPassBack = text; 
    NSLog(@"returning: %@", textToPassBack); 
    [self.delegate takeBackViewController:self didFinishSelectingText:textToPassBack]; 

    [self dismissViewControllerAnimated:YES completion:NULL]; 
} 

#pragma mark - UIPickerViewDataSource methods 

// Number of components in the pickerView 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 1; 
} 

// Number of elements in the pickerView component 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component 
{ 
    return [self.list count]; 
} 

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    return [self.list objectAtIndex:row]; 
} 


#pragma mark - PickeView delegate methods 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    NSLog(@"Selection of element: %@", [self.list objectAtIndex:row]); 
    text = [self.list objectAtIndex:row]; 
} 


#pragma mark - View Controller LifeCycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view. 
    /* 
    list = [[NSMutableArray alloc] init]; 
    [list addObject:@"1"]; 
    [list addObject:@"2"]; 
    [list addObject:@"3"]; 
    [list addObject:@"4"]; 
    [list addObject:@"5"]; 
    */ 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    self.list = [[NSMutableArray alloc] init]; 

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"LolText"]; 

    self.list = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
} 


#pragma mark - Core Data Stack Methods 

- (NSManagedObjectContext *)managedObjectContext 
{ 
    NSManagedObjectContext *context = nil; 
    id localDelegate = [[UIApplication sharedApplication] delegate]; 
    if ([localDelegate performSelector:@selector(managedObjectContext)]) { 
     context = [localDelegate managedObjectContext]; 
    } 
    return context; 
} 

@end 

의 pickerView가 나타납니다 비어 : 2013-07-23 10:51:55.010 MemeGen [51428 : c07] * [UITableViewRowData rectForRow : inSection :], /SourceCache/UIKit_Sim/UIKit-2380.17/UITableViewRowData.m:1630에서 어설 션 실패 2013-07- 23 10 : 51 : 55.012 MemeGen [51428 : c07] u로 인해 앱 종료 중 ncaught 예외 'NSInternalInconsistencyException'이유 '무효 인덱스 경로에 RECT 요청 (2 개 인덱스 [0, 0])' * * 우선 투사 호출 스택 : (0x22bb012 0x16e5e7e 0x22bae78 0xe6b665 0x502f20 0x3c62de 0x756086 0x755f7a 0x37940d 0x37b9eb 0x5e485a 0x5e399b 0x5e50df 0x5e7d2d 0x5e7cac 0x5dfa28 ​​0x34c972 0x34ce53 0x32ad4a 0x31c698 0x264fdf9 0x264fad0 0x2230bf5 0x2230962 0x2261bb6 0x2260f44 0x2260e1b 0x264e7e3 0x264e668 0x319ffc 0x27ad 0x26d5) 의 libC++ abi.dylib : 내가있는 viewDidLoad의 주석 부분을 실행할 때, 테스트의 목적을 위해 예외

을 던지는라고 종료 메서드 (코카 데이터에 대한 모든 주석), 그것은 잘 작동합니다. viewDidLoad에서 viewDidAppear의 코드를 삽입하면 viewController가 화면에 나타나는 순간 충돌이 발생합니다.

나는 진실에서 멀지는 않았지만 탈출구를 찾지 못했습니다. 누구도 저를 도와 줄 수 있습니까?

+0

UIPicker보기의 대리자 메서드에 대한 경계를 유지할뿐만 아니라 할당 할 코어 데이터에서 어떤 값이 나오는지 먼저 확인하십시오. – iEinstein

+0

시도하고 돌아올 것입니다 ... – lweingart

+0

Ok, 다음으로 viewController로 바로 가면 UIPickerView 내가 얻었다 : 2013년 7월 23일 16 : 59 : 50.175 MemeGen [45,906을 : C07]리스트 엘리먼트 (엔티티 : LolText; ID : 0xc03bac0 ; 데이터 : )면, jQuery과 의해 다음 I 얻을 PickerView로 들어가 제 : 2013년 7월 23일 17 : 03 : 03.662 MemeGen [46,266 : C07]리스트 엘리먼트 < NSManagedObject : 0x1046f680> (엔티티 : LolText, ID : 0x1046e9c0 ; 데이터 : { text = "TEST LOLTEXT"; }) 여전히 충돌한다 – lweingart

답변

1

글쎄, 결국 내 코드의 대다수를 바꿨고 특정 시점까지 작동합니다. 가장 큰 문제는 UIPickerView에 의해 반환 된 값을 String으로 사용하고자 할 때 불가능하다는 것입니다. NSKnownKeysDictionary1이라는 값이 붙어 있습니다.

여기 문제가있는 부분이지만 간단한 문자열을 얻을 수있는 방법을 찾을 수 없습니다.

2013-07-23 22:23:16.178 MemeGen[79886:c07] class of { 
    text = "MY TEST LOLTEXT"; 
} = NSKnownKeysDictionary1 
2013-07-23 22:23:16.178 MemeGen[79886:c07] string: (
    "MY TEST LOLTEXT!" 
) 

있는 NSString에 나는 고양이는 문제가 해결되지 않는 사실 :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    // Core Data 
    if (_managedObjectContext == nil) 
    { 
     _managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    } 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"LolText"]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LolText" inManagedObjectContext:_managedObjectContext]; 
    request.resultType = NSDictionaryResultType; 
    request.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"text"]]; 
    request.returnsDistinctResults = YES; 


    _list = [[_managedObjectContext executeFetchRequest:request error:nil] mutableCopy]; 

    for (id key in _list) { 
     NSLog(@"class of %@ = %@", key, [key class]); 
     NSLog(@"string: %@", (NSString *)[[_list objectAtIndex:1] allValues]); 
    } 

    NSLog (@"texts: %@",_list); 
} 

그리고 여기가 로그입니다.NSString 메서드를 사용할 때마다 같은 "인식 할 수없는 선택기 오류"로 끝납니다.

2013-07-23 22:38 : 06.497 MemeGen [80800 : c07] - [NSKnownKeysDictionary1 stringByReplacingCharactersInRange : withString :] : 인스턴스로 전송 된 인식 할 수없는 선택기 2013-07-23 22 : 38 : 06.498 MemeGen [80800 : c07] * 'NSInvalidArgumentException'이라는 캐치되지 않은 예외로 인해 앱 종료 중, 이유 : '- [NSKnownKeysDictionary1 stringByReplacingCharactersInRange : withString :] : 인식 할 수없는 선택 예를 0x94e0a60 '로 전송

핵심 데이터에서 datas를 가져 오는 때 NSKnownKeysDictionary1를 얻을 수없는 방법이 있나요?

1

Pickerview에 시스템 행이없는 행이 없기 때문입니다.

목록에서 데이터를 제공하고 있는지 여부를 확인할 수 있습니다. 그렇다면 문제가 없어야합니다.

데이터가 없는지 확인하고 pickerview를 열지 마십시오.

+0

안녕하세요, 저는 당신의 질문을 이해 있는지 확실하지 않습니다. 목록의 내용을 수동으로 설정하면 완벽하게 정상적으로 작동합니다. 게다가, 나는 아주 잘 핵심 datas의 데이터를 표시하는 UITableViewController 있습니다. 그것은 그것이 비어 있지 않다는 것을 의미합니다, 그렇지 않습니까? 아니면 요점을 놓쳤습니까? – lweingart

+0

당신은 아마 아슈 슈라 같은 것을 의미했다 생각, 내 목록의 내용을 기록하고, 데이터를주고있다. 그러나 나는 스크린에서 비어있는 픽커 뷰 (shooterview) 인 크래시 (crash)를 내 오프닝 포스트에 기록한 로그로 얻는다. – lweingart

0

하! 마침내 그것을했다!

_text = [self.list objectAtIndex:row]; 

그러나 그것을 할당하는 올바른 방법은 다음과 같습니다 :

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

내가 이렇게 내있는 NSString을 할당했다 :

_text = _list[row][@"text"]; 

문제가 해결 문제는 방법이었다! 도움 주셔서 감사합니다.

관련 문제