0

У меня есть приложение Cocoa с NSOutlineView, которым управляет NSTreeController.NSTreeController: пользовательское поведение для привязки «canInsert»

Кроме того, есть кнопка для добавления новых элементов в схему. Я привязал флаг кнопки enabled к значению canInsert древовидного контроллера.

Я только хочу разрешить добавлять до 5 элементов в виде контура. После этого canInsert должен вернуть NO.

Я создал свой собственный подкласс NSTreeController и перезаписал canInsert, но активированный статус кнопки не изменяется, поскольку он не понимает, что контроллер дерева изменился при добавлении элементов.

Я также внедрил: keyPathsForValuesAffectingCanInsert и попытался вернуть различные свойства, такие как content, arrangedObjects, но вам не повезло.

@implementation ILCustomTreeController 

- (BOOL)canInsert 
{ 
    return [[self arrangedObjects] count] < 5; 
} 

+ (NSSet *)keyPathsForValuesAffectingCanInsert 
{ 
    return [NSSet setWithObject:@"content"]; // I also tried 'arrangedObjects' 
} 

@end 
+0

Действительно ли используется ваш собственный подкласс? Вы задали имя класса в Interface Builder? –

+0

Да, у меня есть инструкция NSLog в каждом методе. Оба вызываются ровно один раз. – Mark

ответ

0

Вот обходной путь, который делает работу (хотя я до сих пор считаю, что это должно быть решено с помощью keyPathForValuesAffectingCanInsert). Предложения приветствуются.

@implementation ILCustomTreeController 

- (BOOL)canInsert 
{  
    return [[self arrangedObjects] count] <= 4; 
} 

- (void)addObject:(id)object 
{ 
    [self willChangeValueForKey:@"canInsert"]; 
    [super addObject:object]; 
    [self didChangeValueForKey:@"canInsert"]; 
} 

- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath 
{ 
    [self willChangeValueForKey:@"canInsert"]; 
    [super insertObject:object atArrangedObjectIndexPath:indexPath]; 
    [self didChangeValueForKey:@"canInsert"]; 
} 

- (void)remove:(id)sender 
{ 
    [self willChangeValueForKey:@"canInsert"]; 
    [super remove:sender]; 
    [self didChangeValueForKey:@"canInsert"];  
} 

@end