Отношение NSManagedObject к NSArrayController - PullRequest
0 голосов
/ 24 марта 2011

Что у меня есть:

  • контроллер1 и NSArrayController
  • контроллер2 и NSArrayController.Это имеет родительское отношение к атрибуту controller1.
  • controller1-2Tree и NSTreeController и NSOutlineView для его просмотра.Это показывает иерархию controller1 и дочерние элементы каждого элемента, которые он нашел из отношения родитель / потомок controller2.Это было сделано путем привязки двух NSArrayControllers к значениям и дочерним элементам дерева.

Проблема:

Все в моей ситуации использует привязки ядра.Тем не менее, в отличие от NSTableView, неортодоксальная настройка моего NSOutlineView означает, что мой текущий выбор не передается в мой соответствующий NSArrayController.Например, если я выбираю дочерний элемент в моем controller1-2Tree , это объект из моего controller2 , но controller2 сам по себе не регистрирует изменение выбора.

У меня есть соответствующий код для выбора изменений.Я не уверен, как вручную изменить текущий элемент выбора controller2 или controller1 (хотя это 2, что мне нужно прямо сейчас), основываясь на знании текущего выбранного элемента controller1-2Tree .

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

NSManagedObject *selectedObject = [[controller1-2View itemAtRow:[controller1-2View selectedRow]] representedObject];
NSManagedObjectContext *selectedObjectContext = [selectedObject managedObjectContext];

1 Ответ

0 голосов
/ 24 марта 2011

Хорошо, я прошел сложный путь, который пытался избежать, и заставил это работать, перебирая объекты и контроллеры.Я уверен, что есть лучший способ, чем этот.

if ([controller1-2view parentForItem:[controller1-2view itemAtRow:[controller1-2view selectedRow]]]) {
        // If not nil; then the item has a parent. If nil, it doesn't and isn't selectable.
        NSManagedObject *selectedProject = [[controller1-2view itemAtRow:[controller1-2view selectedRow]] representedObject];
        NSString *selectedProjectName = [selectedProject valueForKey:@"title"];

        NSFetchRequest *controller2FetchRequest = [[NSFetchRequest alloc] init];
        NSManagedObjectContext *moc= [controller2 managedObjectContext];
        NSEntityDescription *controller2Entity = [NSEntityDescription entityForName:@"entityTitle" inManagedObjectContext:moc];
        [controller2FetchRequest setEntity:entityTitle];
        NSError *controller2FetchError = nil;
        newArray = [moc executeFetchRequest:controller2FetchRequest error:&controller2FetchError];
        NSInteger projectCounter = 0;
        [controller2FetchRequest release];

        for (NSString *s in newArray) {
            NSManagedObject *projectMo = [newArray objectAtIndex:projectCounter];  // assuming that array is not empty
            id projectValue = [projectMo valueForKey:@"title"];
            //NSLog(@"projectValue is %@ and selectedProjectName is %@", projectValue, selectedProjectName);
            if (projectValue == selectedProjectName) {
                //NSLog(@"Match found");
                [controller2 setSelectionIndex:projectCounter];
                NSLog(@"Selected in arrayController: %@", [controller2Controller selectedObjects]);
            }
            projectCounter = projectCounter + 1;
        }
}
...