2014-01-25 1 views
0

Если я использую следующий код для того, чтобы установить AppDelegate-х managedObjectContext к firstViewController, который только подкласс UITableViewController в AppDelegate.m «s application: didFinishLaunchingWithOptions метода,managedObjectContext равно нулю, если я установить его в качестве использования имущества, но не нулевое значение, если я установить его в качестве цепного контроллера


    rootTabBarController *rootabbarcontroller = (rootTabBarController *)self.window.rootViewController; 

    UINavigationController *navigationController = [[rootabbarcontroller viewControllers] objectAtIndex:0]; 
    FirstViewController *firstViewController = [[navigationController viewControllers] objectAtIndex:0]; 

    firstViewController.managedObjectContext = self.managedObjectContext; 

, а затем запустить симулятор, значение managedObjectContext устанавливаются в ненулевой в FirstViewController.m» viewDidLoad метода s, и, следовательно, основные данные работают, как ожидалось.

Однако, когда я пытался писать следующий код в методе application: didFinishLaunchingWithOptions::


_firstViewController.managedObjectContext = self.managedObjectContext; 

и запустить имитатор, полученный managedObjectProperty значение в пределах viewDidLoad метода FirstViewController.m «ы установлен в null.

Так почему же первая реализация, которая связана с корневым UITabBarController от корневого UINavigationController до FirstViewController, работает в своем методе viewDidLoad:, но последний (просто установленный на его свойство) не делает этого.

Стоит отметить, что я объявил @property (nonatomic, strong) FirstViewController *firstViewController; в AppDelegate.h, когда я попытался реализовать последним способом. Также установите его класс на соответствующий контроллер представления в раскадровке.

Я прочитал некоторые блоги, чтобы использовать последний подход (ссылки не удобны, извините), поэтому можно было бы использовать последний маршрут, чтобы правильно установить его значение managedObjectContext и синтезировать основные данные с помощью UITableView.

Так что мне не хватает? И возможно ли использовать последний подход (что избавляет меня от многих ошибок кодирования и потенциальных неожиданных ошибок)? И, наконец, что лучший способ взять?

Я использую Xcode 5 и iOS 7, спасибо.

[обновлено]

Если бы я попытался добавить следующую строку в соответствии с предложением Almas в ответ ниже,

self.firstViewController = firstViewController; 

я получил ошибку компиляции, поскольку firstViewController не определен там.

И поэтому я добавил инициализацию firstViewController, добавив следующую строку чуть выше указанной строки.

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

но тогда AppDelegate.m выглядит как работает правильно, но на этот раз, произошла ошибка в viewDidLoad способе FirstViewController.m, который является таким же, как мой первый сообщил один.

+0

Вы пытались использовать 'NSLog', чтобы увидеть, что значения' rootTabBarController', 'navigationController' и' firstViewController' в '- применение: didFinishLaunchingWithOptions: '? –

+0

Да, я пробовал. Ни один из них не возвратил null - в конце концов, если какой-либо из них возвращает null, я не смог бы даже запустить симулятор правильно, верно? – Blaszard

ответ

2

Вы установили локальную переменную firstViewController в свойство ivar/перед настройкой контекста управляемого объекта?

добавить:

self.firstViewController = firstViewController; 
// or 
_firstViewController = firstViewController; 

перед:

_firstViewController.managedObjectContext = self.managedObjectContext; 
+0

Не это ли '@property (неатомный, сильный) FirstViewController' пытается сделать, правильно? Или '@ property' недостаточно, и мне тоже нужно написать свой предложенный код? – Blaszard

+0

Да, с @property вы это объявили. Теперь вам нужно установить его. –

+0

Я обновил свой вопрос, чтобы отразить ваш ответ, но вещи не изменились к сожалению ... – Blaszard