2010-02-20 4 views
2

Je sais comment faire disparaître toutes ces images et revenir, mais je ne sais pas comment écrire cela plus court. Ils sont tous attribués des étiquettes uniques 1-35. Je veux vérifier si tous sont cachés et ensuite effectuer une action.Manière plus courte d'écrire ce code?

if(test.hidden==YES 
     && test2.hidden==YES 
     && test3.hidden==YES 
     && test4.hidden==YES 
     && test5.hidden==YES 
     && test6.hidden==YES 
     && test7.hidden==YES 
     && test8.hidden==YES 
     && test9.hidden==YES 
     && test10.hidden==YES 
     && test11.hidden==YES 
     && test12.hidden==YES 
     && test13.hidden==YES 
     && test14.hidden==YES 
     && test15.hidden==YES 
     && test16.hidden==YES 
     && test17.hidden==YES 
     && test18.hidden==YES 
     && test19.hidden==YES 
     && test20.hidden==YES 
     && test21.hidden==YES 
     && test22.hidden==YES 
     && test23.hidden==YES 
     && test24.hidden==YES 
     && test25.hidden==YES 
     && test26.hidden==YES 
     && test27.hidden==YES 
     && test28.hidden==YES 
     && test29.hidden==YES 
     && test30.hidden==YES 
     && test31.hidden==YES 
     && test32.hidden==YES 
     && test33.hidden==YES 
     && test34.hidden==YES 
     && test35.hidden==YES){ 
do something 
} 
+1

Ne pas comparer '== OUI'. 'if (condition)' est suffisant. 'if (condition == YES)' peut échouer car tout élément différent de zéro est une valeur vraie, mais peut ne pas être égal à 1 ('YES'). – kennytm

+0

Cela me semble un peu trop paranoïaque. Si la méthode est définie pour retourner un BOOL et renvoie quelque chose d'autre qu'un BOOL, c'est un échec majeur. J'espère que Cocoa ne le fera pas vraiment ... –

Répondre

6

En supposant que vous vouliez dire balise comme dans la méthode -tag sur UIView, et ces vues sont tous dans containerView

BOOL allHidden = YES; 
for (int i = 1; allHidden == YES && i <= 35; i++) { 
    allHidden = [[containerView viewWithTag:i] isHidden]; 
} 
if (allHidden) { 
    do_something(); 
} 
4

Que diriez-vous de conserver une série de tests à la place?

Ensuite, vous pouvez simplement faire quelque chose comme:

int testresult = 0; 
for(i = 0; i < 35; i++){ 
    if(test[i].hidden != YES){ 
     testresult = 1; 
     break; 
    } 
} 

if(testresult == 0){ 
    // all tests = yes 
} 

RemarqueCet utilise des tableaux C plutôt que d'un NSArray. Principalement vous devriez passer d'une grande collection de variables nommées de façon similaire à un tableau de ces choses - dans ObjC, il est conseillé (selon les commentaires sur cette réponse) d'utiliser un NSArray.

+0

Pourquoi utiliserait-il un tableau C quand il programme en ObjC? –

+0

@Colin, les tableaux C ne sont-ils pas autorisés dans ObjC? –

+1

Ils sont autorisés, mais NSArrays prend en charge le nettoyage des objets qu'ils contiennent lorsqu'ils sont libérés. – Eld

1

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/KeyValueCoding/Concepts/BasicPrinciples.html#//apple_ref/doc/uid/20002170-BAJEAIEE

Cela peut ne pas être exacte, mais quelque chose comme:

BOOL retVal = test.hidden ; 
for (int i = 2; i < 36 && retVal; ++i) { 
    id x = [self valueForKey:[NSString stringFromFormat:@"test%d", i]]; 
    retVal = retVal && x.hidden ; 
} 
if (retVal) { 
    // do something 
} 

Bien que je pense que le stockage des objets de test dans un NSArray serait mieux.

1

Sont-ils tous contenus dans le même superview? Si oui, essayez ceci pour tirer parti du fait qu'ils sont déjà dans un tableau:

@implementation UIView (testForHiddenSubviews) 

- (BOOL) hasHiddenSubviews 
    { 
    for (UIView *view in self.subviews) 
    if (view.hidden) 
    return YES; 
    return NO; 
    } 

- (BOOL) allSubviewsHidden 
    { 
    for (UIView *view in self.subviews) 
    if (!view.hidden) 
     return NO; 
    return YES; 
    } 

@end