2010-09-30 21 views
7

Tôi đang tìm cách tự động bản địa hóa văn bản trên các nút/văn bản vv và cho phương pháp này tôi cần phải tìm tất cả (ví dụ) UIButton's trên UIView.Tìm tất cả các điều khiển của một loại trong UIView

tôi đã cố gắng 2 phương pháp sau đây, nhưng cả hai đều không làm việc như tôi muốn họ làm việc:

for (UIView* subView in self.view.subviews) 
{ 
    NSLog(@"object class : %@", [subView class]); 

    if ([subView isMemberOfClass:[UIButton class]]) 
     NSLog(@"Button found!"); 
} 

Vấn đề với đoạn mã này là một RoundedRectButton không phù hợp với lớp UIButton, trong khi nó thực sự chỉ là một UIButton.

Tôi cũng thử như sau:

for (UIButton* button in self.view.subviews) 
{ 
// Do my stuff 
} 

Nhưng điều ngu ngốc là, đó là ca cao chạm thực sự chỉ liệt kê tất cả subviews ở chỗ cho vòng lặp (cũng là UITextFields vv).

Có cách nào để thực sự nhận tất cả UIButton từ một chế độ xem không? Hay tôi thực sự cần tìm điều khiển bằng cách nhìn vào bộ chọn của họ.

+0

Chỉ cần lưu ý rằng có cách tốt hơn để thực hiện việc này bằng cách sử dụng các khối. Xem câu trả lời của tôi dưới đây. Cũng lưu ý rằng mã của bạn sẽ chỉ hoạt động đối với các nút nằm trong lớp trên cùng của các bản xem trước. Điều gì về toàn bộ hệ thống phân cấp xem dưới đây? – memmons

Trả lời

9

phương pháp đầu tiên là chính xác, ngoại trừ bạn cần phải thay đổi isMemberOfClass chức năng để isKindOfClass:

isKindOfClass: Trả về một giá trị Boolean đó cho biết người nhận là một thể hiện của lớp nhất định hoặc một ví dụ của bất kỳ lớp nào thừa kế từ lớp đó.

+0

Cảm ơn bạn, đó thực sự là phương pháp tôi đang tìm kiếm. Cảm ơn vì câu trả lời nhanh! –

10

Tại sao viết mã một lần như thế này khi bạn có thể quay số tuyệt vời bằng cách thêm phương pháp danh mục vào UIView bằng cách sử dụng khối? Hãy xem mã ở dưới cùng. Sử dụng phương pháp đệ quy này với các khối, bạn có thể làm những việc như tắt tất cả UITextFields theo quan điểm của một cái nhìn khiển của:

[self.view forEachUITextFieldDoBlock:^(UITextField *textField) { 
    textfield.enabled = NO; 
}]; 

Hoặc mờ dần tất cả UITextFields theo quan điểm của một cái nhìn khiển của:

[UIView animateWithDuration:0.25 animations:^{ 

    [self.view forEachUITextFieldDoBlock:^(UITextField *textField) { 
     textField.alpha = 0.0; 
    }]; 

} 
completion:^(BOOL finished){ 
    // nothing to do for now 
}]; 

Blocks là khá tuyệt vời trong thậm chí bạn có thể truyền các phương thức khác bên trong một khối. Ví dụ, đoạn code dưới đây đi mỗi UITextField tìm thấy phương pháp inserAdornmentImage:forTextView của tôi, có thêm một hình nền tùy chỉnh cho mỗi xem văn bản:

[self.view forEachUITextFieldDoBlock:^(UITextField *textField) { 
    [self insertAdornmentImage:textFieldBGImage forTextField:textField]; 
}]; 

Blocks làm cho phương pháp này vô cùng linh hoạt, do đó bạn không cần phải viết một phương pháp chuyên ngành mỗi khi bạn muốn làm điều gì đó mới với các điều khiển bạn tìm thấy. Đây là nước sốt ma thuật:

@implementation UIView (Helper) 

- (void) forEachUITextFieldDoBlock:(void (^)(UITextField *textField))block 
{ 
    for (UIView *subview in self.subviews) 
    { 
     if ([subview isKindOfClass:[UITextField class]]) 
     { 

     block((UITextField *)subview); 

     } else { 

     [subview forEachUITextFieldDoBlock:block]; 

     } 
    } 
} 

@end 
+1

Rực rỡ. Tôi đã sử dụng điều này để thêm các góc tròn vào tất cả các nút của tôi (bất kỳ ai nhận thấy nút tròn đã bị xóa khỏi Xcode 5). Đồ tốt. –

+0

cảm ơn từ tất cả vì câu trả lời tuyệt vời. Dawg, đó là một ý tưởng hay. – Fattie

Các vấn đề liên quan