2009-05-12 8 views
5

Tengo una aplicación que utiliza datos centrales y enlaces. Quiero tener un NSSearchField que pueda buscar a través de un NSArrayController vinculado a un NSTableView. El controlador de matriz contiene objetos de Datos principales que tienen un campo de "nombre". He fijado el NSSearchField así:Uso de predicados en un controlador de matriz para filtrar objetos relacionados

Bind To: the array controller 
Controller Key: filterPredicate 
Predicate Format: name contains[c] $value 

Esto funciona. Quiero ampliarlo para que pueda buscar en los campos de objetos relacionados con los que están en el controlador de matriz. Cada objeto en el controlador de array tiene una relación to-many con otro tipo de objeto llamado "tag" que tiene un campo llamado "name". Intenté lo siguiente:

Bind To: the array controller 
Controller Key: filterPredicate 
Model Key Path: tags 
Predicate Format: name contains[c] $value 

Sin embargo, esto no funciona. No sucede nada en NSTableView cuando se ingresa texto en NSSearchField. ¿Qué tiene de malo?

Respuesta

10

Enlazando a tags como la ruta de la clave de modelo intenta vincular el predicado del campo de búsqueda a la ruta de la clave arrayController.filterPredicate.tags. Dado que la propiedad filterPredicate del controlador de matriz no tiene una propiedad de etiquetas, probablemente obtenga las excepciones de 'clave no encontrada' que se registran de forma silenciosa. En su lugar, recordando que la filterPredicate de un NSArrayController se aplica a los miembros de la matriz, desea que la unión que se creará algo como esto:

Bind To: <array controller> 
Controller Key: filterPredicate 
Predicate Format: ANY self.tags contains[c] $value 

self.tags se podría escribir como se acaba de tags, pero creo que esto hace es más claro que las etiquetas son una propiedad del objeto al que se aplica el predicado.

+0

utilicé como mi formato de predicado: self.tags.name contiene [c] $ valor Y consigo un error: No se puede hacer una operación de subcadena con algo que no es una cadena (izda = {( "ABC", "XYZ", )} rhs = A) Creo que esto se debe a que el lado izquierdo es un contenedor. ¿Cómo hago para que sea una cadena si hay más de un objeto de etiqueta? – hekevintran

+0

No importa, encontré el motivo. ¡Olvidé la palabra CUALQUIERA! – hekevintran

+0

Excelente. La mejor de las suertes. –

Cuestiones relacionadas