2011-04-22 3 views
1

일부 데이터를 저장하는 Core Data 기반 iPhone 응용 프로그램을 만들고 있습니다.managedObjectContext를 UITabBarController에 전달 문제

루트보기 컨트롤러 (RootViewController)는 UITabBarController입니다. 탭 표시 줄 컨트롤러에는 응용 프로그램 위임자가 두 개의보기 컨트롤러를 제공합니다. 첫 번째는 응용 프로그램의 제목 화면을 나타내는 UIViewController의 인스턴스이고 두 번째 것은 데이터를 표시하는 데 사용되는 UITableViewController입니다.

이것은 Core Data를 사용하는 첫 번째 iPhone 응용 프로그램입니다. 이 응용 프로그램을 구축하는 올바른 방법은 응용 프로그램 대리자에서 managedObjectModel, managedObjectContextpersistentStoreCoordinator 개체를 만들고 초기화 한 다음 참조로 자식보기 컨트롤러에 managedObjectContext을 전달하는 것입니다. 이게 내가 한 일이야.

그러나, 나는에 초기화 탭 표시 줄 컨트롤러에 managedObjectContext 개체를 전달할 관리하지 않았다 내 응용 프로그램 위임의 applicationDidFinishLaunching:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { 
    RootViewController *rootViewController = [[RootViewController alloc] init]; 
    rootViewController.managedObjectContext = self.managedObjectContext; 
    [window addSubview:rootViewController.view]; 
    [window makeKeyAndVisible]; 
    [rootViewController release]; 
    return YES; 
} 

탭 표시 줄이 제대로 표시하고 타이틀 화면보기를로드하더라도 컨트롤러 인 경우 managedObjectContext은 0으로 유지됩니다. 나는 내가 뭘 잘못하고 있는지 알 수 없었다. 나는 또한 문자열에 RootViewController 문자열을 전달하려고 시도했다.

내는 다음과 같이 RootViewController.h 읽기 :

@interface RootViewController : UITabBarController { 
@private 
NSManagedObjectContext *managedObjectContext; 
} 

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 

@end 

내 RootViewController의 viewDidLoad에 방법 :

- (void)viewDidLoad { 
[super viewDidLoad]; 

NSLog(@"%@", self.managedObjectContext); 

ObiadViewController *obiadVC = [[ObiadViewController alloc] init]; 
ObiadListNavController *obiadListVC = [[ObiadListNavController alloc] init]; 

obiadVC.managedObjectContext = self.managedObjectContext; 
obiadListVC.managedObjectContext = self.managedObjectContext; 

NSArray *vcs = [NSArray arrayWithObjects:obiadVC, obiadListVC, nil]; 

self.viewControllers = vcs; 

[obiadVC release]; 
[obiadListVC release]; 

가}

나는 또한 managedObjectContext, 그냥 응용 프로그램 위임에 nil이 아니라고 확인 RootViewController 인스턴스로 전달됩니다. 그것은 마치 RootViewController의 ivars가 초기화되는 것과 같습니다. 이 시점에서만 발생합니다. 나중에 뷰 컨트롤러에서 테이블 뷰 컨트롤러의 문자열을 전달하면 모든 것이 잘됩니다.

내가 분명히했으면 좋겠다. 나는 그 순간 꽤 우둔한 느낌이다.

+0

NSLog (@ "% @", self.managedObjectContext)는 무엇입니까? 귀하의 TabBarController.m에서 출력? 만약 그것이 없다면 실제로 managedObjectContext를 nil에 두는 것입니다. obiadVC.managedObjectContext = self.managedObjectContext;가 아닌가? obiadVC.managedObjectContext = self.delegate.managedObjectContext; –

+0

은 단순한 alloc/init 대신에'RootViewController * rootViewController = [[RootViewController alloc] initWithNibName : @ "RootViewController"번들 : nil]이 아닌가?; –

답변

2

UITabBarController Class Reference 명확하게 UITabBarController가이 서브 클래스로되어 있지 않은지 상태 :

이 클래스는 서브 클래 싱하기위한 것이 아닙니다.

이 경우 당신은 당신의 UITabBarController가의 인스턴스 수와 앱 위임의 아래 applicationDidFinishLaunching에에 뷰 컨트롤러를 추가
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    tabBarController = [[UITabBarController alloc] init]; 

    FirstViewController *firstViewController = [[FirstViewController alloc] init]; 
    SecondViewController *secondViewController = [[SecondViewController alloc] init]; 

    firstViewController.managedObjectContext = self.managedObjectContext; 
    secondViewController.managedObjectContext = self.managedObjectContext; 

    NSArray *vcs = [NSArray arrayWithObjects:firstViewController, secondViewController, nil]; 
    tabBarController.viewControllers = vcs; 

    [window addSubview:tabBarController.view]; 
    [window makeKeyAndVisible]; 

    [firstViewController release]; 
    [secondViewController release]; 

    return YES; 
} 

는 도움이되기를 바랍니다.

+3

스토리 보드로 어떻게 할 수 있습니까? 프로그래밍 방식으로 뷰 컨트롤러에 액세스 할 수 없기 때문에 필요가 없습니다. – MrJD

관련 문제