2012-08-07 3 views
0

이 항목에 대한 대부분의 질문을 읽었지만 어떻게 든이 문제를 파악할 수 없습니다.managedObjectContext 전달 문제

AppDelegate의 ManagedObjectContext를 초기 뷰 콘트롤러가 데이터도 처리했던 이전 애플리케이션의 첫 번째 뷰로 손쉽게 넘겨 주었다.

이제 새로운 응용 프로그램을 만들 때 사용자가 선택해야하는 초기 화면이 필요합니다 (몇 가지 가능한 단추를 통해). 이 화면에서 내 MOC는 문제 해결 (NSLog 메시지가 내게 MOC에 유효한 주소를 제공함)에 따라 그대로 유지됩니다.

선택이 끝나면 앱은 TableView가있는 UIViewController로 진행합니다. 이 관점에서 데이터를 관리 할 수 ​​있어야하지만 MOC는 아무 것도 반환하지 않습니다.

응용 프로그램은 UINavigationController를 통해 다음보기로 진행합니다.

나는 내 AppDelegate에에 다음 코드를 통합 :

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
InitialViewController *controller = (InitialViewController *)navigationController.topViewController; 
controller.managedObjectContext = self.managedObjectContext; 
return YES; 

InitialViewController 모두가 여전히 잘되는 경우, FIRST의 ViewController입니다.

다음 viewcontroller는 MasterViewController라고하며 NSFetchedControllerDelegate입니다. 여기에서는 NOC에 액세스 할 수없는 것 같습니다. 나는 동일한 주제에 대해 이전의 질문에서 제안 된 여러 접근법과 해결책을 시도했지만 아무 것도 효과가없는 것으로 보인다.

올바른 코딩을 통해 MasterViewController에서 NOC를 작동시키는 방법은 무엇입니까?

오, 그래, 근무 솔루션 중 하나는 다음 코드를 삽입합니다 MasterViewController에있는 viewDidLoad 이후 :

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
self.managedObjectContext = appDelegate.managedObjectContext; 

내 MOC는 구할 수 있지만이 그것을 할 올바른 방법인가?

답변

0

당신은 스토리 보드를 사용하는 경우,

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    [super prepareForSegue:segue sender:sender]; 
    if ([[segue identifier] isEqualToString:@"segueNameOfPresentingYourModalViewController"] == YES) { 
     UINavigationController *navigationController = segue.destinationViewController; 
     YourCustomViewController *aController = (YourCustomViewController *)navigationController.topViewController; 
     aController.managedObjectContext = self.managedObjectContext; 
    } 
    else if ([segue.identifier isEqualToString:@"segueNameOfPushingYourViewController"] == YES) { 
     YourCustomViewController *aController = segue.destinationViewController; 
     aController.managedObjectContext = self.managedObjectContext; 
    } 
} 

당신은 스토리 보드를 사용하지 않는 경우, 당신은 유사하게 설정하여 당신이 push하거나 present 할 컨트롤러의 managedObjectContext를 본다. 또 다른 일반적인 장소는 -tableView:didSelectRowAtIndexPath: 방법입니다.

+0

왜 나는 세그 (segue)를 통해 그것을 넘겨주는 것을 생각하지 않았는가? 이것은 전역 변수를 선언하지 않고도 우아한 방법처럼 보입니다. 오늘 내 코드에서이 코드를 시험해보고 내 결과와 함께 돌아올 것입니다. 그러나이 코드가 제대로 작동해야한다고 생각합니다. –

+0

예상대로 정상적으로 작동하는지 테스트했습니다. 의견을 보내 주셔서 감사합니다. 종종 극복하기 어려운 문제는 다소 간단한 해결책이 있습니다. –

-1

"controller.managedObjectContext"라고 쓰면 InitialViewController에 NSManagedObjectContext * 속성이 명확하게 추가됩니다. MasterViewController에 동일한 속성을 추가하고 self.managedObjectContext도 할당해야합니다. 당신의 appDelegate.h에서

:

extern NSManagedObjectContext* moc; 
각 컨트롤러에 MOC를 추가해야하지 않으려면

, 단순히 MOC에 대한 전역 변수를 선언 아무 문제가 없다

다음과 같은 .m이있는 모든 .m :

#import "AppDelegate.h" 

은 moc에 액세스 할 수 있습니다. 당신은 또한 당신의 AppDelegate에에 속성을 추가 할 수 있으며 각각의 컨트롤러에 당신이 할 수 있습니다

AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
app.managedObjectContext 
+0

전역 변수를 사용할 필요가 없습니다. 관리되는 개체 컨텍스트에서 전달하는 것이 훨씬 좋습니다. 나는'initWithManagedObjectContext :'메소드를 제안한 다음 관리 객체 컨텍스트를 인스턴스 변수에 저장한다. – mackross

+0

나는 당신의 해결책을 알고 있었지만 그들은 좋은 습관이 아닌 것 같습니다. 내가 볼 때마다 뷰에서만 MOC를 넘겨주는 솔루션이 필요하다. 그런 식으로 미래의 프로젝트에서 더 큰 프로젝트로 작업하고 싶다면, 새로운 MOC를 '메인 MOC'에 쓰기 전에 임시 저장 데이터로 선언 할 수있다. 어쨌든, 답장을 보내 주셔서 감사합니다. –

관련 문제