2012-11-29 18 views
14
-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
    imageView.image = [UIImage imageNamed:@"Sample.png"]; 
    [self.view addSubview:imageView]; 
    NSArray *subviews = [self.view subviews]; 
    for(id element in subviews) { 
     if ([[element class] isKindOfClass:[UIImageView class]]) //check if the object is a UIImageView 
     { 
     NSLog(@"element is a UIImageView\n"); 
     [element setCenter:CGPointMake(500., 500.)]; 
     } else { 
     NSLog(@"element is NOT a UIImageView\n"); 
     } 
    } 
} 

mi aspettavo l'uscita di essere "elemento è un UIImageView, ma in realtà è elemento non è un UIImageView perché non è che ci sono altri .. subviews un solo V'è, inoltre, quando viene eseguito, l'immagine viene visualizzata a 100,100, non 500.500 come previstoUtilizzando isKindOfClass:.? Non capisco il motivo per cui questo codice si comporta in questo modo

+0

Ho provato semplicemente a modificare il codice per utilizzare UIImageView anziché id e i risultati erano gli stessi. L'ID –

+1

può essere utilizzato come riferimento. Quello che ti manca è che stai chiamando isKindOfClass metodo in modo sbagliato. Controlla la mia risposta. –

risposta

44

L'assegno è sbagliato. Dovresti chiamare lo isKindOfClass: sull'oggetto e non sulla classe dell'oggetto.

[element isKindOfClass:[UIImageView class]] 
+0

+1. Questo è il problema qui. – iDev

+0

Grazie! Ora lo dici, è ovvio! Lo stavo ispezionando nel debugger e il debugger stava mostrando UIImageView, il che mi rendeva davvero frustrante. Stavo solo guardando la parte sbagliata del codice per eseguire il debug. Grazie ancora. –

+0

Ovvio, ma il nome del metodo è confuso. In inglese, la parola "è" implica identità. Sono sicuro che è qui che sono uscito di pista. Il nome del metodo dovrebbe essere -isInstanceOfClass: invece, se me lo chiedi. –

0

Prova il seguente codice

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
    imageView.image = [UIImage imageNamed:@"Sample.png"]; 
    [self.view addSubview:imageView]; 
    NSArray *subviews = [self.view subviews]; 
    for(UIView *view in subviews) { 
     if ([view isKindOfClass:[UIImageView class]]) //check if the object is a UIImageView 
     { 
     NSLog(@"element is a UIImageView\n"); 
     [element setCenter:CGPointMake(500., 500.)]; 
     } else { 
     NSLog(@"element is NOT a UIImageView\n"); 
     } 
    } 
} 

è anche possibile controllare viste sotto per valore tag..:

initially set imageView.tag=101; //anything you want 

for(UIView *subview in [view subviews]) { 
    if(subview.tag== 101)/*your subview tag value here*/ 
    { 

NSLog(@"element is a UIImageView\n"); 
    } else { 
     NSLog(@"element is NOT a UIImageView\n"); 
    } 
} 
+0

Quindi è perché non l'ho lanciato? –

+0

Non importa. Non sta funzionando. Probabilmente l'idea del tag non funzionerà per il mio progetto, a meno che non utilizzi lo stesso tag per tutte le immagini. Ci sarà un numero sconosciuto di immagini con una durata sconosciuta. –

+0

ho appena modificato la mia risposta 'if ([view isKindOfClass: [UIImageView class]])' Controlla ora. –

Problemi correlati