2010-02-20 3 views
2

Я знаю, как заставить все эти uiimageviews исчезнуть и вернуться снова, но я не знаю, как писать это короче. Все они назначены уникальными тегами 1-35. Я хочу проверить, все ли они скрыты, а затем выполнить действие.Более короткий способ написать этот код?

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

Не сравнивайте '== YES'. 'if (condition)' достаточно. 'if (condition == YES)' может выйти из строя, потому что ничего отличное от нуля является истинным значением, но может не равняться 1 ('YES'). – kennytm

+0

Это кажется немного чересчур параноидальным для меня. Если метод определен для возврата BOOL и возвращает что-то, отличное от BOOL, это довольно серьезная ошибка. Я надеюсь, что Cocoa на самом деле не делает этого ... –

ответ

6

Предполагая, что вы имели в виду тег как в -tag метода на UIView, и эти представления находятся в containerView

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

Как насчет сохранения массива тестов вместо этого?

Тогда вы можете просто сделать что-то вроде:

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

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

Примечание это использует C массивы, а не NSArray. В принципе, вам следует переключиться с того, что массив массивов этих объектов имеет большую совокупность аналогичных переменных - в ObjC рекомендуется использовать (как в комментариях к этому ответу) использование NSArray.

+0

Зачем ему использовать массив C, когда он программирует в ObjC? –

+0

@Colin, массивы C не разрешены в ObjC? –

+1

Они разрешены, но NSArrays заботится о очистке объектов, которые они хранят, когда они выпущены. – Eld

1

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

Это не может быть точным, но что-то вроде:

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 
} 

Хотя я думаю, что хранение объектов испытаний в качестве NSArray будет лучше.

1

ли все они содержатся в одной и той же надтаблицы? Если это так, попробуйте воспользоваться этим, чтобы воспользоваться тем фактом, что они уже находятся в массиве:

@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 
Смежные вопросы