CoreData UITableViewController managedObjectContext Ошибка - PullRequest
4 голосов
/ 08 декабря 2011

Я начал играть с CoreData и взялся за новый проект с CoreData и встроил эти основы в свой собственный проект. Я достиг стадии, когда я более или менее одинаково продублировал новый проект, однако получаю ошибку.

Эта строка, controller.managedObjectContext = self.managedObjectContext; вызывает у меня проблемы. Когда я комментирую это, приложение просто запускается с пустым UITableView, однако, если я включаю строку, это вызывает эту ошибку:

Universal[24718:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewController setManagedObjectContext:]: unrecognized selector sent to instance 0x1521a0'
*** First throw call stack:
(0x344558bf 0x346a51e5 0x34458acb 0x34457945 0x343b2680 0x2413 0x378367eb 0x378303bd 0x377fe921 0x377fe3bf 0x377fdd2d 0x30c30df3 0x34429553 0x344294f5 0x34428343 0x343ab4dd 0x343ab3a5 0x3782f457 0x3782c743 0x2331 0x22c8)
terminate called throwing an exception

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

Строка находится в методе didFinishLaunchingWithOptions делегата приложения, так же, как в новом проекте с основными данными.

По запросу, файл заголовка для контроллера табличного представления:

#import <UIKit/UIKit.h>

#import <CoreData/CoreData.h>

@interface myTableViewController : UITableViewController <NSFetchedResultsControllerDelegate>

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

@end

Ответы [ 4 ]

6 голосов
/ 07 января 2012

Причина, по которой вы получаете ошибку, в вашем AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
    return YES;
}

При использовании шаблона CoreData по умолчанию контекст управляемого объекта назначается topViewController, который больше не является MasterViewController, поскольку вы вставили другое представление в качестве отправной точки. Таким образом нераспознанный селектор отправляется на экземпляр.

У вас есть два варианта:

1) Удалите код, который назначает контекст управляемого объекта, и в представлении, которое нуждается в этом, получите его так:

 [[[UIApplication sharedApplication] delegate] mainManagedObjectContext];

2) Сохраните код (исправьте имя класса), добавьте объявление для managedObjectContext и передайте объект NSManagedObjectContext по всему вашему приложению между всеми вашими UIViewControllers

2 голосов
/ 05 ноября 2012

Это зависит от того, как структурировано ваше приложение. Если вы используете TabBarViewController перед всем кодом отличается немного

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;

    UINavigationController *navigationController = (UINavigationController *)[[tabController viewControllers] objectAtIndex:0];
    MasterViewController *controller = (MasterViewController *)[[navigationController viewControllers] objectAtIndex:0];
    controller.managedObjectContext = self.managedObjectContext;

    return YES;
}
2 голосов
/ 08 декабря 2011

Вам не хватает некоторой проводки, которая связывает UIViewController с (или их подклассы) до NSFetchedResultsController. Вы получаете это бесплатно, когда настраиваете новый проект с включенными Core Data, но если вы добавляете Core Data в существующий проект, вам нужно подключить несколько вещей самостоятельно.

Для получения дополнительной информации, пожалуйста, см. http://wiresareobsolete.com/wordpress/2009/12/adding-core-data-existing-iphone-projects/

1 голос
/ 08 ноября 2012

У меня была такая же проблема.Я решил эту проблему, убедившись, что свойство ManagedContextObject включено в корневой контроллер представления (самый первый контроллер представления, подключенный к самому первому контроллеру навигации) независимо от того, использует ли оно его.

в .h контроллера Root View:

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;

в .m

@synthesize managedObjectContext;

извинения, если мой ответ немного тупой.Я должен ошеломить вещи для себя, чтобы понять их:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...