Передача контекста в iOS для использования Core Data с раскадровкой
У меня есть некоторые проблемы при передаче контекста от делегата приложения до контроллера представления. Я нашел много учебников в Интернете, и все они предлагают использовать didFinishLaunchingWithOptions
метод для создания контроллера представления, установите свойство context и нажмите его. Моя проблема в том, что я хочу использовать раскадровку, и контроллер представления создается и помещается в него, а не в делегат приложения.
Я пытался сделать это в моем делегате приложения:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//instantiate local context
NSManagedObjectContext *context = [self managedObjectContext];
if (!context)
{
// Handle the error.
NSLog(@"Error: Context is null");
}
//reference the view controller
helloCoreDataViewController1_001 *rootViewController = [helloCoreDataViewController1_001 alloc];
// Pass the managed object context to the view controller
rootViewController.managedObjectContext = context;
return YES;
}
и это на мой взгляд контроллер:
@implementation helloCoreDataViewController1_001
@synthesize name, address, phone, status, managedObjectContext;
//....
- (IBAction)saveContact
{
NSLog(@"name: %@",self.name.text);
NSLog(@"address: %@",self.address.text);
NSLog(@"phone: %@",self.phone.text);
//Save the new instance of the contact entity
Contact *contact = (Contact *)[NSEntityDescription insertNewObjectForEntityForName:@"Contacts" inManagedObjectContext:managedObjectContext];
[contact setContactName:[NSString stringWithFormat:@"%@",self.name.text]];
[contact setValue:self.address.text forKey:@"address"];
[contact setContactPhone:[NSString stringWithFormat:@"%@",self.phone.text]];
NSError *error = nil;
if (![managedObjectContext save:&error])
{
// Handle the error.
NSLog(@"error: %@", error.description);
self.status.text = @"Error: contact NOT saved";
}
else
self.status.text = @"Contact saved";
}
Когда я отлаживаю, я вижу, что в делегате приложения контекст заполняется правильно, а также свойство в контроллере представления в порядке. Но когда мой saveContact
метод вызывается, контекст пуст.
У вас есть предложения по этому поводу? Как я могу передать контекст контроллеру представления с раскадровкой?
2 ответа
Вы можете получить корневой контроллер Storyboard в didFinishLaunchingWithOptions, открыв
self.window.rootViewController
вместо выделения нового.
Таким образом, эти две строки в ваших didFinishLaunchingWithOptions должны выглядеть следующим образом:
helloCoreDataViewController1_001 *rootViewController = (helloCoreDataViewController1_001 *)self.window.rootViewController;
rootViewController.managedObjectContext = context;
Вместо того, чтобы передавать управляемый контекст объекта в контроллер представления, попробуйте получить его на контроллере представления из appDelegate:
- (NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
if (managedObjectContext == nil) {
id appDelegate = (id)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = [appDelegate managedObjectContext];
}... //finish your fetch request of course...
}
Со мной это работало красиво