2012-07-03 2 views
0

Я передаю NSManagedObjectContext из AppDelegate в ViewController. Затем я извлекаю результаты из Core Data. Однако NSManagedObjectContext всегда равен нулю в методе ViewDidLoad, но не в методе ViewDidAppear.Property ViewDidLoad Issues

Я понимаю разницу между этими двумя методами, но я думал, что я должен иметь доступ к свойствам из 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); 
    } 
} 

Edit: я прохожу его, как этот

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

сделалFinishLaunchingWithOptions – 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

Если вы получаете доступ к NSFetchedResultController в viewDidAppear это потому, что создается после 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, который не находится на экране, может быть освобожден, если выдается предупреждение о состоянии памяти. И в это время код инициализации не получит вызов снова, когда представление нужно вернуть к жизни, но viewDidload будет снова вызван.

+0

контекст nil, я сделал NSLog объекта. Код, который вы написали, выглядит точно так же. Контекст nil in 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