2012-07-03 5 views
0

AppController에 AppDelegate의 NSManagedObjectContext를 전달하고 있습니다. 그런 다음 Core Data의 결과를 가져옵니다. 그러나 NSManagedObjectContext는 ViewDidLoad 메서드에서는 항상 nil이지만 ViewDidAppear 메서드에서는 그렇지 않습니다.속성 ViewDidLoad 문제

두 가지 방법의 차이점을 이해했지만 ViewDidLoad에서 속성에 액세스 할 수 있어야한다고 생각했습니다. Apple의 샘플 코드에서이 작업을 수행하는 것으로 나타났습니다.

그냥 ViewDidAppear에서 가져와야합니까?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // This code crashings because my because my Context is nil 
    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); 
    } 
} 

편집 : 난 내가 확신 할 것이라고 대답 할 수있는 충분한 정보가없는이

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];  
    rootViewController.managedObjectContext = self.managedObjectContext; 
    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 

    self.tabBarController = [[UITabBarController alloc] init]; 

    self.tabBarController.viewControllers = [NSArray arrayWithObjects:rootNav, nil]; 

    self.window.rootViewController = self.tabBarController; 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 
+0

여기서 'NSManagedObjectContext'를 뷰 컨트롤러로 전달하고 있습니까? – Macondo2Seattle

+0

didFinishLaunchingWithOptions – Vikings

+0

해당 코드를 게시 할 수 있습니까? didFinishLaunching의보기 컨트롤러 상태는 스토리 보드를 사용 중인지 또는 초기보기 컨트롤러인지 여부에 따라 달라집니다. – Macondo2Seattle

답변

0

여기 내 문제에 대한 해결책이 있습니다. 네비게이션 타이틀과 몇 가지 다른 항목을 설정하기 위해이 모든 메소드를 사용했습니다. 이 방법을 사용하여 viewDidLoad에서이 모든 작업을 수행하여 문제가 해결되었습니다.

누군가가 이것이 문제의 원인에 대한 더 많은 통찰력을 가지고 있다면, 나는 그것을 듣고 싶습니다.

- (id)initWithNibName:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 

    if (self) { 

     // UINavigationBar 
     self.navigationItem.title = @"List"; 

     // UINavigationBar Button 
     UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)]; 

     self.navigationItem.rightBarButtonItem = addButton; 
    } 

    return self; 
} 
+0

init 메소드에 뷰 코드를 두는 것이 나쁜 이유를 설명하는 편집을했습니다. –

0

처럼 통과,하지만 여기 내 생각이다. 당신이 // This code crashings because my because my Context is nil 썼다

문맥은 실제로 "전무 없습니다"입니다,하지만 NSFetchedResultController은 아직 초기화되지 않았으며 여전히 nil

당신은 viewDidAppear에 NSFetchedResultController에 접근 즉,있는 viewDidLoad 이후에 생성되기 때문에이 있다면 귀하의 코드입니다. 해당 속성의 getter 또는 ViewDidLoad에서 NSFetchedResultController의 생성을 이동할 수 있습니다.

방금 ​​AppDelegate에 테스트 코드를 작성했습니다. 있는 UITableViewController 하위 클래스

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

if (self.managedObjectContext) 
{ 
    NSLog(@"Managed object ic not nil"); 
} 
} 

그리고 출력에

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
listView *rootViewController = [[listView alloc] initWithNibName:@"listView" bundle:nil];  
rootViewController.managedObjectContext = self.managedObjectContext; 

self.window.rootViewController = rootViewController; 

[self.window makeKeyAndVisible]; 
return YES; 
} 

은 다음과 같습니다 testCoreDataLauchn[1690:207] Managed object ic not nil

PS :이 솔루션/문제와 함께 갈 수있는 오타


죄송합니다 .

init에서 뷰 요소에 액세스하여 xib AKA 뷰를 강제로로드해야하기 때문에 좋지 않습니다. VC에 무언가를 할당하기 전에 viewDidLoad가 호출됩니다. init 메소드에서 모든 뷰 관련 코드를 제거하고 viewDidLoad에 배치하면 VC에 대한 일반 뷰 라이프 사이클이 있어야합니다. 또한 네비게이션 컨트롤러에서 메모리 경고가 문제가되면 화면에 표시되지 않는 VC의 뷰가 할당 해제 될 수 있습니다. 그리고 그 시점에서 뷰를 다시 가져올 필요가있을 때 init 코드가 다시 호출을 얻지는 않지만 viewDidload가 다시 호출됩니다.

+0

컨텍스트가 nil 인 경우 개체의 NSLog를 수행했습니다. 작성한 코드는 완전히 똑같습니다. 컨텍스트는 viewDidLoad에서는 nil이지만 viewDidAppear에서는 그렇지 않습니다. – Vikings

+0

@Vikings 더 많은 코드를 볼 필요가 있습니다. 컴파일러가 경고를주지 않습니까? –

+0

감사합니다, 경고 없음, 문자열을 설정하려고해도 내 모든 속성이 viewDidLoad에서 nil입니다. – Vikings

0

'NSManagedObjectContext'를 앱 대리인의 속성으로 노출하고 뷰 컨트롤러에서 해당 속성을 읽는 것은 어떻습니까?

+0

viewDidAppear에서로드하는 것뿐만 아니라 작동 할 것입니다. viewDidLoad에서 사용할 수 있어야하므로 솔루션을 찾고있었습니다. – Vikings

+0

@Vikings : 귀하의 문제는 내가 가진 것과 관련이있는 것으로 보입니다. http://stackoverflow.com/questions/10858939/segue-destination-view-controller-weirdness. 결국 해결 방법을 구현했습니다. – Macondo2Seattle