2012-01-25 14 views
5

Lặp lại tất cả UIViews trong các bản xem trước của một lớp và sau đó kiểm tra loại trong vòng lặp bằng cách sử dụng isKindOfClass làm cho mã của tôi trông thừa. Vì vậy, tôi đã viết phương pháp sau đây thực hiện một khối cho mỗi subview.Lặp lại tất cả các bản xem trước của một loại cụ thể

@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 

Khối được chuyển đến phương pháp này lấy đối số loại id. Các loại được sử dụng ở đây nên tất nhiên giống như được thông qua như là đối số đầu tiên. Tuy nhiên cho đến nay tôi đã không tìm ra cách để làm cho loại này an toàn hơn.

Trả lời

11

Hãy thử như thế này, nên đủ an toàn.

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

Tôi đồng ý rằng tôi nên sử dụng isMemberOfClass thay vì isKindOfClass. Tuy nhiên vấn đề tôi đã chỉ ra là nhiều hơn rằng tôi có thể vượt qua một khối mà có một đối số của bất kỳ loại nào. Trường hợp đối số phải là loại UIView hoặc có nguồn gốc từ nó. Cụ thể hơn, nó phải thuộc cùng một lớp với kiểu viewType được truyền cho phương thức. – Nils

+1

Sau đó, bạn sẽ phải vượt qua lớp học để chặn là tốt và kiểm tra an toàn lớp học bên trong khối. Cách khác là sử dụng 'typeof (class) subview' trong đối số khối của bạn, nhưng điều đó sẽ làm cho phương thức của bạn phụ thuộc vào một số biến bên ngoài. –

+0

Điều đó không có vẻ thanh lịch. Vì vậy, bạn sẽ không thay đổi bất cứ điều gì về phương pháp trên? – Nils