2012-02-03 10 views

Respuesta

50

NSArray no garantiza que solo pueda almacenar una copia de un objeto dado, por lo que debe asegurarse de que lo haga usted mismo (o use NSOrderedSet).

Dicho esto, hay un par de enfoques aquí. Si los objetos de su categoría implementan isEqual: para que coincida con category_title, puede usar -indexOfObject:.

Si no puede hacer eso (porque los objetos de categoría usan una definición diferente de igualdad), use -indexOfObjectPassingTest:. Se necesita un bloque en el que pueda hacer cualquier prueba que desee para definir su "prueba"; en este caso, probar category_title igualdad de cadenas.

Tenga en cuenta que estos están todos declarados para NSArray, por lo que no los verá si solo está mirando el encabezado/documentación NSMutableArray.

EDITAR: Ejemplo de código. Esto supone objetos de la clase CASCategory con un NSString propiedad categoryTitle (no puedo llevar yo para poner subrayado en un nombre de Ivar :-):

CASCategory *cat1 = [[CASCategory alloc] init]; 
    [cat1 setCategoryTitle:@"foo"]; 
    CASCategory *cat2 = [[CASCategory alloc] init]; 
    [cat2 setCategoryTitle:@"bar"]; 
    CASCategory *cat3 = [[CASCategory alloc] init]; 
    [cat3 setCategoryTitle:@"baz"]; 

    NSMutableArray *array = [NSMutableArray arrayWithObjects:cat1, cat2, cat3, nil]; 
    [cat1 release]; 
    [cat2 release]; 
    [cat3 release]; 

    NSUInteger barIndex = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
     if ([[(CASCategory *)obj categoryTitle] isEqualToString:@"bar"]) { 
      *stop = YES; 
      return YES; 
     } 
     return NO; 
    }]; 

    if (barIndex != NSNotFound) { 
     NSLog(@"The title of category at index %lu is %@", barIndex, [[array objectAtIndex:barIndex] categoryTitle]); 
    } 
    else { 
     NSLog(@"Not found"); 
    } 
+0

Gracias. ¿Puedes publicar un fragmento de cómo usar indexOfObjectPassingTest? – jroyce

+1

Por favor, mira mi edición. –

+0

Ok, eso fue muy apreciado e hice exactamente lo que estaba pidiendo. – jroyce

1

No estoy seguro de que entiendo la pregunta, pero algo como esto podría funcionar (suponiendo que la matriz mutable contiene objetos de la clase "Categoría"):

int indx; 
bool chk; 
for (Category *aCategory in theArray) 
{ 
    chk = ([[aCategory category_title] isEqualToString:@"valOfCategoryTitle"]) 
    if (chk) 
     indx = [theArray indexOfObject:aCategory]; 
} 
+0

Bastante correcto en principio (y probablemente lo que hay que hacer si necesita soportar iOS <4), pero para sistemas más modernos, debe considerar el enfoque basado en bloques. –

+0

Sí, los bloques son buenos, pero solo intentamos que sea sencillo ilustrar la idea. –

+0

Gracias. Ver tanto esta respuesta como la respuesta basada en bloques de Conrad Shultz es esclarecedora. –

0

probar este código mucho más sencillo: -

int f = [yourArray indexOfObject:@"yourString"]; 
+1

El OP desea buscar una matriz de objetos personalizados, no una matriz de cadenas. –

+0

puede buscar un objeto de esta manera también y lo he implementado para cadenas y objetos – Leena

+2

Claro, pero requiere que -isEqual: de la clase personalizada haga una comprobación de igualdad de cadenas en contra, en el caso del OP, category_title. Esto no está indicado en la pregunta, por lo que esta solución, tal como está escrita, generalmente no funcionará. –

Cuestiones relacionadas