Произошел сбой пользовательского средства доступа NSMangedObject NSOutlineView

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

Я настроил NSOutlineView для доступа к данным 5 различных сущностей Core Data. Доступ к данным каждой сущности осуществляется с помощью отдельного NSArrayController, который связан с сущностью и ее ManagedObjectContext. Затем у меня есть методы NSOutlineViewDataSource, возвращающие правильный объект NSString в зависимости от того, какая сущность была расширена.

ПРИМЕЧАНИЕ: entity объявляется в другом месте как NSArray с именами для сущностей.

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index
       ofItem:(id)item {

if(nil == item) {
    return [entities objectAtIndex:index];
}
NSInteger entityIdx = [entities indexOfObject:item];
if (entityIdx == NSNotFound) {
    return @"";
}
id returnObject = @"";
switch (entityIdx) {
    case 0: {
        Person *person  = [[peopleArrayController arrangedObjects] objectAtIndex:index];
        returnObject = person.fullName;
        break;
    }
    case 1: {
        Media *media = [[mediaArrayController arrangedObjects] objectAtIndex:index];
        returnObject = media.imageTitle;
        break;
    }
    case 2: {
        Note *note  = [[notesArrayController arrangedObjects] objectAtIndex:index];
        returnObject = note.noteDescription;
        break;
    }
    case 3: {
        Source *source = [[sourcesArrayController arrangedObjects] objectAtIndex:index];
        returnObject = source.title;
        break;
    }
    case 4: {
        Repository *repo = [[repostioriesArrayController arrangedObjects] objectAtIndex:index];
        returnObject = repo.name;
        break;
    }
    default:
        break;
}


return returnObject;

}

Свойство сущности Person fullName и свойство сущности Media imageTitle являются пользовательскими средствами доступа.

- (NSString *)fullName {
[self willAccessValueForKey:@"surName"];
[self willAccessValueForKey:@"givenName"];
NSString *firstName = [self valueForKey:@"givenName"];
NSString *lastName = [self valueForKey:@"surName"];
NSString *string = [NSString stringWithFormat:@"%@ %@", (firstName) ? firstName : @"", (lastName) ? lastName : @""];
[self didAccessValueForKey:@"surName"];
[self didAccessValueForKey:@"givenName"];
return string;

}

- (id) imageTitle {
[self willAccessValueForKey:@"path"];
id title = [[self valueForKey:@"path"] lastPathComponent];
[self didAccessValueForKey:@"path"];
return title;

}

Программа зависала, когда я пытался развернуть сущность Person или Media, но не при расширении других сущностей. Я проследил сбой до [NSCell _setContents:][NSObject(NSObject) doesNotRecognizeSelector:]

Я изменил возвращаемое свойство Media на стандартное свойство доступа к данным Core @"path", и программа перестала аварийно завершать работу при расширении сущности Media. Так что проблема определенно связана с пользовательским аксессором.

К вашему сведению - я проверил, чтобы сущность была настроена на использование класса NSManagedObject.

Кто-нибудь может дать мне причину сбоя, кроме ошибки?

1 ответ

Решение

Я обошел эту проблему, изменив метод

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item

вернуть управляемый объект

case 1: {
        Media *media = [[mediaArrayController arrangedObjects] objectAtIndex:index];
        returnObject = media;
        break;
    }

Тогда у меня есть метод - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item

вернуть строку

    if ([item isKindOfClass:[Media  class]]) {
    Media *media = (Media *)item;
    return media.imageTitle;
}
Другие вопросы по тегам