2012-01-25 9 views
5

Bir sınıfın alt görünümlerindeki tüm UIView'ler üzerinde yineleme ve isKindOfClass kullanarak döngüdeki türün denetlenmesi kodumu gereksiz kıldı. Bu yüzden, her alt görüş için bir blok yürüten aşağıdaki yöntemi yazdım.Belirli bir türdeki tüm alt görünümler üzerinde yineleyin

@implementation Util 

+ (void)iterateOverSubviewsOfType:(Class)viewType 
        view:(UIView*)view 
        blockToExecute:(void (^)(id subview))block 
{ 
    for (UIView* subview in view.subviews) { 
     if ([subview isKindOfClass:viewType]) { 
      block(subview); 
     } 
    } 
} 

@end 

Bu yönteme geçirilen blok tipi id bir argüman alır. Burada kullanılan tür, elbette ilk argüman olarak geçtiği ile aynı olmalıdır. Ancak şu ana kadar, bu türün güvenliğini sağlamak için bir yol bulamadım.

cevap

11

Bunu benzer şekilde deneyin, yeterince güvenli olmalıdır.

for (id subview in view.subviews) { 
     if ([subview isMemberOfClass:viewType]) { 
      block(subview); 
     } 
    } 
+0

isKindOfClass yerine isMemberOfClass kullanmam gerektiğini kabul ediyorum. Ancak, işaret ettiğim sorun, herhangi bir türden bir argümanı alan bir bloğu geçebildiğimden daha fazlası. Argümanın UIView türünde olması veya ondan türetilmesi gerekir. Daha spesifik olarak, yönteme geçirilen viewType ile aynı sınıfta olmalıdır. – Nils

+1

Öyleyse, dersi de engellemek için bloğu geçmeniz ve blok içinde sınıf güvenliğini kontrol etmeniz gerekir. Diğer yol, blok argümanınızda "typeof (class) subview" işlevini kullanmaktır, ancak bu yönteminizin bazı harici değişkenlere bağımlı olmasını sağlar. –

+0

Bu çok şık görünmüyor. Yani yukarıdaki yöntemde hiçbir şeyi değiştirmeyeceksin? – Nils

İlgili konular