Я пишу свое первое приложение для iPhone/Cocoa. Он имеет два вида таблицы внутри навигационного представления. Когда вы касаетесь строки в первом представлении таблицы, вы попадаете во второй вид таблицы. Я хотел бы, чтобы второе представление отображало записи из объектов CoreData, связанных со строкой, к которой вы коснулись первого представления.Передача ManagedObjectContext ко второму представлению
У меня есть данные CoreData, которые отображаются в первом представлении таблицы. Вы можете коснуться строки и перейти ко второму представлению таблицы. Я могу передавать информацию из выбранного объекта с первого на второй. Но я не могу получить второе представление, чтобы сделать свой выбор CoreData. Для жизни я не могу получить объект managedObjectContext для перехода ко второму контроллеру представления. Я не хочу выполнять поиск в первом представлении и передавать словарь, потому что я хочу иметь возможность использовать поле поиска для уточнения результатов во втором представлении, а также вставить новые записи в данные CoreData.
Вот функция, которая переходит от первого ко второму виду.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here -- for example, create and push another view controller.
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondView" bundle:nil];
secondViewController.tName = [[selectedObject valueForKey:@"name"] description];
secondViewController.managedObjectContext = [self managedObjectContext];
[self.navigationController pushViewController:secondViewController animated:YES];
[secondViewController release];
}
И это функция внутри SecondViewController, что выходит из строя:
- (void)viewDidLoad {
[super viewDidLoad];
self.title = tName;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) { // <-- crashes here
// Handle the error...
}
}
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
/*
Set up the fetched results controller.
*/
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
// **** crashes on the next line because managedObjectContext == 0x0
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SecondEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
// <snip> ... more code here from Apple template, never gets executed because of the crashing
return fetchedResultsController;
}
Любые идеи о том, что я делаю неправильно здесь?
managedObjectContext - это неживой объект.
ОБНОВЛЕНИЕ: я вставил NSLog (описание [[managedObjectContext registeredObjects]]); в viewDidLoad и, похоже, managedObjectContext передается просто отлично. Тем не менее, все еще рушится.
Нагрузочного приложение из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «+ entityForName: не мог определить местонахождение NSManagedObjectModel для имени объекта„SecondEntity“»
Что происходит, когда вы помещаете код, который инициализирует выбранный контроллер результатов в viewDidLoad? У меня есть приложение, которое делает по сути одно и то же, и оно отлично работает для меня, но я создаю свой обработчик получаемых результатов непосредственно в viewDidLoad с помощью initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName :. – Tim
@Tim Я просто попробовал это, он падает таким же образом. Странно, что если я установил точку останова, все переменные-члены self будут NULL, но заголовок будет правильно установлен, так что это не может быть правдой. – amo