2012-03-26 5 views
7

Tôi muốn có được cái nhìn đó là trả lời đầu tiên, hiện tại tôi có một UITableView chứa UITextFields, sử dụng một phương pháp:Tìm Xem đó là firstresponder

-(UIView*) findFirstResponder 
{ 

} 

Tôi muốn để có thể có được chế độ xem là firstResponder và sau đó thực hiện điều gì đó với chế độ xem đó.

Bất kỳ ý tưởng nào?

+0

Bạn có bao nhiêu textFields trong tableView? –

+0

Chúng được tạo tự động nhưng tôi đã tìm thấy một cách ngay bây giờ – Armand

+0

Vui mừng khi biết điều đó, chỉ cần đăng nó làm câu trả lời. :) –

Trả lời

17

Tất cả tôi phải làm là

@implementation UIView (FindViewThatIsFirstResponder) 
- (UIView *)findViewThatIsFirstResponder 
{ 
    if (self.isFirstResponder) {   
     return self;  
    } 

    for (UIView *subView in self.subviews) { 
     UIView *firstResponder = [subView findViewThatIsFirstResponder]; 
     if (firstResponder != nil) { 
      return firstResponder; 
     } 
    } 

    return nil; 
} 
@end 
+0

Bạn không cần textField chính nó? Mối quan hệ giữa subview và table với textFields là gì? – o15a3d4l11s2

+0

Để tìm hiểu chi tiết hơn lý do tại sao điều này có hiệu quả đối với tôi: Tôi có UITextField có UIPickerView làm inputView, giờ đây tất cả đều được tạo động nên tôi không giữ bất kỳ tham chiếu nào đến bất kỳ trường nào ngoại trừ chế độ xem bảng, Tôi chọn một trường text mà UIPickerView sẽ hiển thị và sau đó tôi chọn một giá trị trong bộ chọn để thiết lập văn bản của UITextField, sau đó tôi đã phải gọi một phương thức ủy nhiệm để chuyển giá trị đã chọn trở lại cho trình theo dõi hiện tại. xem câu hỏi này http://stackoverflow.com/questions/9874037/uipickerview-and-uitextfield-get-value-from-uipickerview/ – Armand

+0

Giải pháp tốt;) – Emad

14

Sử dụng UIControl như một tham chiếu gốc với các loại khác nhau của điều khiển mà có thể trở thành responder đầu tiên.

UIControl *currentControl; 

Như Gobot nói - bất cứ khi nào một textfield trở nên trả lời đầu tiên, giữ một lưu ý trong đó một là ...

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 

    currentControl = textField; 

    . . . 
+1

Sheesh, tất cả các giải pháp khác đều vô lý. Điều này sẽ là câu trả lời hàng đầu cho tất cả các câu hỏi tương tự :) – taylorcressy

+0

Điều gì xảy ra nếu phần trả lời đầu tiên không phải là 'UITextField'? Có 'UITextView' s quá, và có lẽ những người khác ...? Đừng làm cho tôi sai đây là một giải pháp tốt cho câu hỏi được hỏi, nhưng tôi đang tìm kiếm một cái gì đó phổ biến hơn một chút. – devios1

+0

Bạn có thể sử dụng tham chiếu đến UIControl. Xem ở trên – Damo

0

Tôi muốn chia sẻ với bạn thực hiện của tôi cho thấy trả lời đầu tiên trong bất cứ nơi nào của UIView. Tôi hy vọng nó sẽ giúp và xin lỗi cho tiếng anh của tôi. Cảm ơn

+ (UIView *) findFirstResponder:(UIView *) _view { 
    if ([subView isFirstResponder]) 
     return subView; 
    if ([subView isKindOfClass:[UIView class]]) { 
     UIView *v = subView; 

     if ([v.subviews count] > 0) { 
     retorno = [self findFirstResponder:v]; 
     if ([retorno isFirstResponder]) { 
      return retorno; 
     } 
     } 
    } 
} 
1

Không có cách nào đơn giản để tìm firstResponder trong iOS. Các câu trả lời ở trên chỉ theo dõi UIView s nhưng tất cả các lớp con của UIResponder chẳng hạn như UIViewController có thể là một phản hồi đầu tiên.

Theo Quick Help của UIResponder:

Nhiều đối tượng chủ chốt cũng có phản ứng, trong đó có đối tượng UIApplication , các đối tượng UIViewController, và tất cả các đối tượng UIView (mà bao gồm UIWindow). Khi các sự kiện xảy ra, UIKit sẽ gửi chúng đến các đối tượng trả lời của ứng dụng để xử lý.

Và cách duy nhất để theo dõi UIResponder chuỗi sẽ được sử dụng UIResponder 's next: UIResponder thuộc tính.

Trả về bộ trả lời tiếp theo trong chuỗi phản hồi hoặc không có nếu không có không có phản hồi tiếp theo. Lớp UIResponder không tự động lưu trữ hoặc đặt tự động trả lời tiếp theo , do đó phương thức này trả về nil theo mặc định. Các lớp con phải ghi đè phương thức này và trả về một đáp ứng thích hợp tiếp theo. Ví dụ: UIView triển khai phương thức này và trả về đối tượng UIViewController quản lý nó (nếu có) hoặc trình giám sát (nếu không). UIViewController tương tự triển khai phương thức và trả về giám sát của chế độ xem của nó. UIWindow trả về đối tượng ứng dụng . UIApplication trả về nil.

Trong các đối tượng UIKit nhất superview, UIViewController, UIWindow, UIApplication hoặc Appdelegate sẽ là nextUIResponder.

extension UIResponder { 
    func findFirstResponder() -> UIResponder? { 
     var responder: UIResponder? = self 
     while responder != nil { 
      guard let r = responder, r.isFirstResponder() else { 
       responder = responder?.next 
       continue 
      } 
      return r 
     } 
     return nil 
    } 
} 

Tuy nhiên phần trên không theo dõi anh chị em của responder. Tôi đoán nếu bạn thực sự muốn theo dõi tất cả, bạn cần phải kiểm tra loại trả lời và theo dõi con của nó (subview, con xem điều khiển).