Отношение NSManagedObject к NSArrayController

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

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

Проблема:

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

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

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

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

person biscuitstack    schedule 24.03.2011    source источник


Ответы (1)


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

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;
        }
}
person biscuitstack    schedule 24.03.2011