2012-03-17 7 views
3

3 일 동안 키보드를 상대로 머리를 두드려보고 연구하고 시도하는 방법을 알아 냈습니다. 나는 다음 문제를 해결할 수있다. -> 내비게이션 컨트롤러 - 메인 뷰 컨트롤러에>두 뷰 사이에 네비게이션 컨트롤러가있을 때 appDelegate에서 첫 번째 ViewController로 managedObjectContext를 전달하는 방법

초기 앱 시작 화살표 :

나는 다음과 같습니다 스토리 보드를 가지고있다.

내 appDelegate가 managedObjectContext를 만들고 일부 엔티티에 데이터를 채 웁니다. atm 만 테스트하면 외부 소스와 통합 할 준비가되면 제거됩니다. 이 작업은 훌륭합니다. 이제 내 문제는 탐색 컨트롤러가 작동하기 때문에 appDelegate에서 첫 번째 ViewController로 MOC를 전달할 수있는 방법을 모르겠다는 것입니다. appDidFinish 방법에 내 현재 코드는 다음과 같습니다

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    // Pass the managed object context to the root view controller 
    MainMenuViewController *rootView = (MainMenuViewController *)self.window.rootViewController; 
    rootView.managedObjectContext = self.managedObjectContext; 

    //My actual Core data setup and adding data to it, it works I've tested it. 

    return YES; 
    } 

이제 내 코드가 스토리 보드에서 앱 시작 화살표가 내 mainMenuViewController를 가리 키도록 어디 변경할 때 작동하지만, 그러나 나는 모든 내 탐색 모음을 잃지 않는 것보다 내 견해. 또한 내 메인 메뉴에서 MOC를 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender을 통해 다른보기로 전달하는 방법을 알고 있지만 appDelegate에서 MainViewController로 초기 패스를 수행하는 방법을 알아낼 수 없습니다. 두.

나는 이미이 사이트 (및 기타)의 수많은 스레드를 검색했으며 "탭 응용 프로그램"에 대한 솔루션을 찾았지만 다른 사람들은 객체를 직렬화하기를 원하지만 내 용도로는 할 수 없습니다. 그. (몇 가지보기 만이 MOC를 수신하고 다른보기는 고유보기에서 특정 목적에 맞게 작성되고 변경된 데이터를 전달합니다)

iOS 및 Objective-C에서이 nub에 대한 도움은 크게 있습니다. 고맙습니다. 미리 감사드립니다.

편집 : 내가 오류입니다 "로 인해 캐치되지 않는 예외에 응용 프로그램을 종료 ... [UINavigationController가 setManagedObjectContext] 알 수없는 선택은 ... 인스턴스에

+0

철자를 잘못 입력했을 가능성이 있습니까? 당신은 setManagedObjectCOntext에 capitol O를 가지고 있습니다. 아마도 setManageObjectContext 여야합니다. 나는 단지 보지 못했던 단순한 오타 때문에 발생한 문제를 해결하기 위해 수 시간을 보냈다. 그 일은 일어났다. .. –

+0

포럼에이 유형이 있었는데, 내 코드가 컴파일되고 실행되므로 그렇게되지 않았다. 그것이 실행되면 충돌을 감안할 때 : ( – user597608

답변

10

를 보낸 당신은에서 새 응용 프로그램을 작성하는 경우"마스터 - 세부 " 엑스 코드 4.3에서 응용 프로그램 템플릿 (4.2뿐만 아니라, 내가 생각하는)는 "사용 스토리 보드"와 "사용 코어 데이터"옵션을 선택, 당신은 AppDelegate.m에서 다음을 확인할 수있는 것들 :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
    MasterViewController *controller = (MasterViewController *)navigationController.topViewController; 
    controller.managedObjectContext = self.managedObjectContext; 
    return YES; 
} 

이 될 것으로 보인다 중요한 점은 네비게이션 컨트롤러에 뷰 컨트롤러를 쿼리 할 수 ​​있다는 것입니다.

+0

트릭을 주신 Rickster에게 감사를드립니다. 이것은 팀 프로젝트이며 어떤 이유로 든 해당 라인을 삭제해야합니다.>< – user597608

2

NSManagedObjectContext가 AppDelegate에서 설정 되었다면이를 전달하지 않습니다. 오히려, 당신은에 대한 참조를 만들 : 당신이에서를 참조하는 개체의 유형은 관계가

AppDelegate *appDel = [UIApplication sharedApplication].delegate; 
NSManagedObjectContext *context = appDel.managedObjectContext; 

, 수신 객체와 AppDelegate에 사이 객체의 다른 종류가있다.

0

내 대답은 본질적으로 수용 답변과 동일합니다. 단, 광산에서는 템플릿 (분할보기 템플릿뿐만 아니라)의 유무와 상관없이 사용할 수 있습니다. - 제공하고 있습니다. 귀하의 질문에 더 직접적으로 대답하는 대답이며, 컨텍스트 관리자 개체에 대한 참조를 하위보기 다음에 대상보기 컨트롤러에 전달하는 방법입니다.

이 대답은 내 첫 번째 대답 (허용 된 답변과 달리)은 관리 대상 객체 컨텍스트가 앱의 어디에 있는지를 알고 있고 참조를 만드는 데 필요한 기본적인 기술을 가지고 있다고 가정합니다 (엑스 코드에 ... 찾기를 사용할 수없는 가정도이 같은 포인터에 값을 할당하는 방법을 기억할 수있는 허용 대답과는 달리 : 당신이 답변에 잘 반응하는 것 때문에

id moc = [reference to the managed object context object that you can find] 

그 템플릿이 포함 된 경우 단일 응용 프로그램보기 템플릿의 UIViewController 하위 클래스에서 제공되는 prepareForSegue 메서드 재정의를 시도하십시오. 내부에는 Apple에서 남긴 몇 가지 주석이 있습니다.

하면 값 대상 뷰 컨트롤러에 관리 오브젝트 컨텍스트 변수에 대한 포인터 기준 값을 설정이어서

SecondVC *vc2 = segue.destinationController; 

: 요컨대

는,이 추천 대상 뷰 컨트롤러에 대한 참조를 생성 할 인스턴스가 생성 된 곳이 참조의 점 :

vc2.mbo = AppDelegate.mbo; 

내가 정말 철저 예를 제공 (비디오 데모와 함께) 스토리 보드없이 segues을 만드는 (즉, 프로그램)에서 :

당신이 내 대답에 AppDelegate에 참조의 사용을 이해하는데 어려움을 겪고 있다면 그런데

Set segue identifier programmatically

, 나는 그것을 설명 할 것 :

  1. 애플이 코어 데이터가 개체 컨텍스트를 관리 둔다 Xcode 템플릿을 사용하여 새 프로젝트를 만들 때마다 AppDelegate.h/.m에서 참조하고 템플릿 설정 중에 코드 데이터 사용 확인란을 선택하십시오. 응용 프로그램 전체에서 해당 참조를 사용하려면 (예 : 다른 .m 파일 내에서 여러 인스턴스를 생성하지 않으려면) 응용 프로그램 전반에 대한 전역 참조를 만듭니다. AppDelegate는 UIApplication의 위임자가됩니다 ((AppDelegate에 정의

    수입 "AppDelegate.h"

    :, 이는 너무 의해 단순히 모든 구현 파일이 추가되는 관리되는 개체 컨텍스트를 참조하고자, AppDelegate에에게 싱글을, 싱글 톤 AppDelegate *) [[UIApplication sharedApplication] delegate])

이제 관리되는 객체 문맥 객체는 다음 두 행이 추가 된 곳이면 어디에도 없습니다.

[AppDelegate.mbo...];