2012-07-03 104 views
0

我從AppDelegate將NSManagedObjectContext傳遞給ViewController。然後我從Core Data獲取結果。但是,NSManagedObjectContext在ViewDidLoad方法中始終爲零,而不是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

這是我的問題的解決方案。我在我所有的方法中使用這個init方法來設置導航標題和其他一些項目。我採取了這種方法,並在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中後創建在你的代碼中。您可以將該NSFetchedResultController的創建移動到該屬性的getter或ViewDidLoad中。

我剛剛在AppDelegate中寫了一個測試代碼。

- (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; 
} 

在一個UITableViewController子類

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

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

,輸出爲:testCoreDataLauchn[1690:207] Managed object ic not nil

PS:很抱歉的錯字


這是去與你的解決方案/問題。

這很糟糕,因爲您正在訪問init中的視圖元素,迫使xib AKA視圖立即加載。 所以你的viewDidLoad將被調用,然後你可以分配一些東西給你的VC。 從init方法中刪除所有與視圖相關的代碼,並將其放置在viewDidLoad中,並且您應該爲VC創建更正常的視圖生命週期。 另請注意,如果存在內存警告問題,則在導航控制器中,不在屏幕上的VC視圖可能會被取消分配。 而在那段時間,當視圖需要恢復時,init代碼不會再次調用,但viewDidload將再次調用。

+0

上下文是零,我做了一個NSLog的對象。你寫的代碼看起來完全一樣。上下文在viewDidLoad中爲零,但不是viewDidAppear – Vikings

+0

@Vikings我需要看到更多的代碼,並且編譯器沒有給出警告? –

+0

謝謝,沒有警告,我的所有屬性都是無viewDidLoad,即使我嘗試設置一個字符串 – Vikings

0

如何將'NSManagedObjectContext'公開爲應用程序委託的屬性,並且只是在視圖控制器中讀取該屬性?

+0

我知道這將工作,以及只需將其加載在viewDidAppear中。我只是在尋找一個解決方案,因爲它應該在viewDidLoad中可用。 – Vikings

+0

@Vikings:你的問題似乎與我所擁有的問題有關:http://stackoverflow.com/questions/10858939/segue-destination-view-controller-weirdness。我最終實施了一種解決方法。 – Macondo2Seattle