2012-11-29 16 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"); 
     } 
    } 
} 

Spodziewałem wyjście być „elementem jest UIImageView, ale to rzeczywiście element nie jest UIImageView Dlaczego Nie dlatego, że istnieją inne .. subviews jest tylko jeden Ponadto po uruchomieniu, obraz wyświetlany jest na 100,100, a nie 500.500 jak oczekiwanoKorzystanie isKindOfClass.? Nie rozumiem, dlaczego ten kod zachowuje się w ten sposób

+0

Próbowałem po prostu zmienić kod, aby użyć UIImageView zamiast id, a wyniki były takie same. –

+1

id może być używany jako odniesienie. To czego brakuje, to wywołanie metody KindOfClass w niewłaściwy sposób. Sprawdź moją odpowiedź. –

Odpowiedz

44

Twoje sprawdzenie jest nieprawidłowe. Powinieneś zadzwonić pod numer isKindOfClass: na obiekt, a nie na klasę obiektu.

[element isKindOfClass:[UIImageView class]] 
+0

+1. To jest problem tutaj. – iDev

+0

Dziękujemy! Teraz o tym wspomnij, to oczywiste! Sprawdzałem to w debugerze, a debugger pokazywał UIImageView, co było naprawdę frustrujące. Właśnie szukałem niewłaściwej części kodu do debugowania. Dzięki jeszcze raz. –

+0

Oczywiste, ale nazwa metody jest myląca. W języku angielskim słowo "jest" oznacza tożsamość. Jestem pewna, że ​​właśnie tam wyszłam z tropu. Nazwa metody powinna być -isInstanceOfClass: zamiast tego, jeśli mnie pytasz. –

0

Spróbuj następujący kod

-(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"); 
     } 
    } 
} 

można również sprawdzić sub widoki przez wartość znacznika..:

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

A więc dlatego, że go nie rzuciłem? –

+0

Nieważne. To nie działa. Pomysł na tag prawdopodobnie nie zadziała dla mojego projektu, chyba że użyję tego samego znacznika dla wszystkich obrazów. Będzie nieznana liczba zdjęć o nieznanym okresie życia. –

+0

Właśnie edytowałem moją odpowiedź 'if ([widok isKindOfClass: [klasa UIImageView]])' Sprawdź teraz. –

Powiązane problemy