Подкласс NSTokenFieldCell для принудительного использования отношения базовых данных ко многим

Я столкнулся с интересной загадкой (конечно, я мог просто делать что-то ужасно неправильное).

Я бы хотел, чтобы NSTokenField "представлял" отношения в приложении с основными данными. Предпосылка такая: вы щелкаете по заметке из TableView (загруженной из контроллера массива Notes). Поле токена затем связывается (через "значение") с выбором контроллера массива Notes. Теги. Теги - это отношение "многие-многие" к сущности Notes.

Очевидно, что NSTokenField не примет NSSet, который предоставляет Контроллер массива. Чтобы обойти это, я вложил в NSTokenFieldCell и переопределил его objectValue а также setObjectValue: методы. Я думал, что смогу просто перевести NSSet, который был предоставлен NSArray, что ожидал NSTokenFieldCell. (Примечание. Первоначально я пытался переопределить эти методы в подклассе NSTokenField; однако они не вызывались.)

Итак, я придумал указанный код:

- (void)setObjectValue:(NSSet*)object {
    tagsList = [object copy];
    NSMutableArray *displayList = [[NSMutableArray alloc] init];
    for (id newObject in tagsList) {
        [displayList addObject:[newObject valueForKey:@"Name"]];
    }
    [super setObjectValue:displayList];
}

- (id)objectValue {
    NSArray *displayList = [super objectValue];
    NSEntityDescription *tagEntity = [NSEntityDescription 
                               entityForName:@"Tag" 
                               inManagedObjectContext:[appDelegate 
                                                       managedObjectContext]];
    NSMutableSet *returnValue = [[NSMutableSet alloc] init];
    for (NSString *token in displayList) {
        NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
        [request setEntity:tagEntity];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                  @"Name == %@", token];
        [request setPredicate:predicate];

        NSError *error;
        NSArray *results = [[appDelegate managedObjectContext] executeFetchRequest:request error:&error];
        if (results == nil) {
            NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:[appDelegate managedObjectContext]];
            [object setValue:token forKey:@"Name"];
            [returnValue addObject:object];
        } else {
            [returnValue addObject:[results objectAtIndex:0]];
        }
    }
    return returnValue;
}

Это падает.:(И, что удивительно, он падает на линии, которая вызывает [super objectValue], Это дает мне ошибку:

-[NSConcreteAttributedString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance ...

Вздох. Печально то, что когда я захожу в XML-файл Core Data и присваиваю Note метку, он отображается правильно, и [super setObjectValue:] передается массив строк. Однако, как только я ввожу что-то еще и убираю мышь, я получаю ошибку.

Я не уверен, что с этим делать. Может ли кто-нибудь заметить что-то ужасно не так с этим? Благодарю.

ОБНОВЛЕНИЕ: если это имеет значение, у меня нет делегата, настроенного для TokenField.

1 ответ

Решение

Как обычно, я нашел ответ на свой вопрос. Это было глупо для начала. Мне просто нужен был другой ArrayController, связанный с набором Notes. Затем я связал NSTokenField с ArrangedObjects этого контроллера, реализовал несколько методов делегатов. Boom. Просто.

Дурак я.

Другие вопросы по тегам