Estoy creando un NSPredicateEditor en el código y tratando de lograr lo que esperaba que fuera una tarea bastante simple. Básicamente, me gustaría mostrar un compuesto NSPredicateEditorRowTemplate (que le da al usuario la opción de realizar coincidencias cuando "Todos/Cualquiera/Ninguno de los siguientes son verdaderos") y un número de subdominios bastante básicos debajo de él. Para hacer esto, construyo mi NSPredicateEditor y ato su valor para guardar los cambios a medida que el usuario edita su predicado.Forzar la visualización de una fila compuesta con NSPredicateEditor
El problema que estoy experimentando es que, no importa qué, no puedo hacer que un compuesto NSPredicateEditorRowTemplate se muestre de manera predeterminada como la fila principal con una sola subrow. Cuando creo el predicado inicialmente que pase un predicado vacío falsa, así:
filename BEGINSWITH[cd] ''
Con el fin de obligar a la pantalla de una fila compuesto que tengo que crear dos subfilas:
filename BEGINSWITH[cd] '' && path ==[cd] ''
Para referencia, Así es como yo estoy construyendo el NSPredicateEditor:
NSArray *keyPaths = [NSArray arrayWithObjects:[NSExpression expressionForKeyPath:@"filename"], [NSExpression expressionForKeyPath:@"path"], nil];
NSArray *operators = [NSArray arrayWithObjects:[NSNumber numberWithInteger:NSEqualToPredicateOperatorType],
[NSNumber numberWithInteger:NSNotEqualToPredicateOperatorType],
[NSNumber numberWithInteger:NSBeginsWithPredicateOperatorType],
[NSNumber numberWithInteger:NSEndsWithPredicateOperatorType],
[NSNumber numberWithInteger:NSContainsPredicateOperatorType],
nil];
NSPredicateEditorRowTemplate *template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions:keyPaths
rightExpressionAttributeType:NSStringAttributeType
modifier:NSDirectPredicateModifier
operators:operators
options:(NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption)];
NSArray *compoundTypes = [NSArray arrayWithObjects:[NSNumber numberWithInteger:NSNotPredicateType],
[NSNumber numberWithInteger:NSAndPredicateType],
[NSNumber numberWithInteger:NSOrPredicateType],
nil];
NSPredicateEditorRowTemplate *compound = [[NSPredicateEditorRowTemplate alloc] initWithCompoundTypes:compoundTypes];
NSArray *rowTemplates = [NSArray arrayWithObjects:compound, template, nil];
[template release];
[compound release];
predicateEditor = [[NSPredicateEditor alloc] init];
[predicateEditor setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[predicateEditor setRowTemplates:rowTemplates];
[predicateEditor setCanRemoveAllRows:NO];
[predicateEditor setContinuous:YES];
[predicateEditor setFrame:[[scrollView contentView] bounds]];
// Create a custom binding for our NSPredicateEditor
SIPredicateStringValueTransformer *transformer = [[[SIPredicateStringValueTransformer alloc] init] autorelease];
NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionaryWithObjectsAndKeys:transformer, NSValueTransformerBindingOption, [NSNumber numberWithBool:YES], NSValidatesImmediatelyBindingOption, nil];
[predicateEditor bind:@"value" toObject:self withKeyPath:@"self.filter.predicate" options:bindingOptions];
// Add our NSPredicateEditor to our NSScrollView
[scrollView setDocumentView:predicateEditor];
Esto era exactamente correcto. Gracias por una respuesta tan detallada. Espero que esto ayude a alguien en el futuro. – ndg