Получение SIGABRT при выполнении fetchRequest

Я использую Xcode 4.2 и iOS SDK 5.0, а также шаблон приложения Apple Master-Detail для iPad с Core Data. Это похоже на пример кода «Местоположения». Мне удалось передать контекст управляемого объекта (MOC) из MasterViewController (MVC) в DetailViewController (DVC). Контроллер подробного представления принимает ввод от пользователя в некоторых текстовых полях и сохраняет его в основных данных; эта часть работает как шарм. Теперь у меня есть ActionViewController (AVC), представляющий собой всплывающее представление, которое должно позволять пользователю отправлять по электронной почте все данные в MOC, если они того пожелают. Однако при попытке выполнить выборку я получаю SIGABRT. Я использовал точки останова, чтобы точно определить, где:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //Fetch the crosses
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event"
                                                          inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; // Where it crashes

    //Other code
}

Кроме того, в отладчике я вижу, что указатель контекста * имеет значение 0x0, что, как я предполагаю, означает, что его там нет?

То, как я заставил MVC передать MOC, было таким:

// Pass the managedObjectContext to the DetailViewController as a property
_detailViewController.managedObjectContext = self.managedObjectContext;

//Pass the MOC to the actionViewController
_actionViewController.managedObjectContext = self.managedObjectContext;

Я просмотрел другие сообщения, и кажется, что передача MOC всем контроллерам представления из AppDelegate может быть подходящим способом, но я хотел выяснить, почему ввод данных работает для DVC, но вылетает при получении данных в AVC . Какую большую ошибку я совершил?

Исправлена ​​ссылка на проект github: https://github.com/scottdaniel/fly_punnett


person Robot-Scott    schedule 02.03.2012    source источник


Ответы (1)


Итак, я понял это, хотя, вероятно, я нарушаю какой-то принцип "хорошего программирования"...

Все, что я сделал, это удалил

//Pass the MOC to the actionViewController
_actionViewController.managedObjectContext = self.managedObjectContext;

вместе со всеми другими подключениями от AVC к MVC (т. е. @class ActionViewController, @property *ActionViewController в интерфейсе MCV) ‹‹ спросите у меня полную информацию, если хотите, или проверьте ее на github (ссылка выше)

Затем я просто добавил

#import AppDelegate.h

в мой ActionViewController.m

и изменил создание MOC следующим образом:

-(void)tableView:(UITableView *)tableView 
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Fetch the crosses
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication 
                                    sharedApplication] delegate] 
                                    managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Event"
                               inManagedObjectContext:context];

MOC успешно создан, и я могу взять данные для пользователя и поместить их в электронное письмо, которое они могут отправить кому угодно.

person Robot-Scott    schedule 05.03.2012