2012-03-26 3 views
7

मैं विचार है कि पहले प्रत्युत्तर है प्राप्त करना चाहते हैं यह है कि दृश्य का पता लगाएं, वर्तमान में मैं एक UITableView कि UITextFields शामिल है, एक विधि का उपयोग कर:firstresponder

-(UIView*) findFirstResponder 
{ 

} 

मैं चाहते हैं पाने के लिए सक्षम होने के लिए वह दृश्य जो पहला रेस्पॉन्डर है और फिर उस दृश्य के साथ कुछ करें।

कोई विचार?

+0

तालिका में आपके पास कितने टेक्स्टफिल्ड्स हैं? –

+0

वे गतिशील रूप से बनाए गए हैं लेकिन मुझे अभी एक रास्ता मिला है – Armand

+0

यह जानकर खुशी हुई कि, इसे उत्तर के रूप में पोस्ट करें। :) –

उत्तर

17

सभी मैं करना था

नियंत्रण के विभिन्न प्रकार है कि पहले प्रत्युत्तर बन सकता है के लिए एक रूट संदर्भ के रूप में
@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

क्या आपको टेक्स्ट फ़ील्ड की आवश्यकता नहीं है? टेक्स्टफिल्ड्स के साथ सबव्यू और तालिका के बीच संबंध क्या है? – o15a3d4l11s2

+0

यह मेरे बारे में अधिक जानकारी देने के लिए क्यों होगा कि यह मेरे लिए क्यों काम करेगा: मेरे पास UITextField है जिसमें UIPickerView इनपुट व्यू के रूप में है, अब ये सभी गतिशील रूप से बनाए गए हैं, इसलिए मेरे टेबल दृश्य को छोड़कर किसी भी फ़ील्ड में कोई संदर्भ नहीं है, इसलिए जब मैं UIPickerView को एक टेक्स्टफील्ड का चयन करूंगा और फिर मैं यूआईटीएक्स्टफिल्ड के पाठ को सेट करने के लिए पिकर में एक मान का चयन करता हूं, फिर मुझे चयनित वैल्यू को वर्तमान संवाददाता को वापस पास करने के लिए एक प्रतिनिधि विधि को कॉल करना पड़ा। यह प्रश्न देखें http://stackoverflow.com/questions/9874037/uipickerview-and-uitextfield-get-value-from-uipickerview/ – Armand

+0

अच्छा समाधान;) – Emad

14

उपयोग UIControl था।

UIControl *currentControl; 

Gobot कहते हैं - जब भी किसी पाठ फ़ील्ड पहले प्रत्युत्तर हो जाता है, एक नोट यह है जो एक के रखना ...

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

    currentControl = textField; 

    . . . 
+1

शीश, ये सभी अन्य समाधान हास्यास्पद हैं। यह सभी समान प्रश्नों पर शीर्ष उत्तर होना चाहिए :) – taylorcressy

+0

क्या होगा अगर पहला उत्तरदाता 'UITextField' नहीं है? 'UITextView भी है, और शायद अन्य ...? मुझे गलत मत समझो यह सवाल पूछने के लिए एक अच्छा समाधान है, लेकिन मैं कुछ और अधिक सार्वभौमिक की तलाश में हूं। – devios1

+0

आप यूआईसींट्रोल के संदर्भ का उपयोग कर सकते हैं। ऊपर देखें – Damo

0

मैं चाहूँगा आपके साथ साझा करने के लिए अपने कार्यान्वयन के लिए में पहली प्रत्युत्तर लगता है UIView के कहीं भी। मुझे उम्मीद है कि यह मेरी अंग्रेजी के लिए मदद और खेद है। धन्यवाद

+ (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

आईओएस में firstResponder लगाने के लिए कोई आसान तरीका नहीं है। उपरोक्त उत्तरों केवल UIView एस पर नज़र रख रहे हैं लेकिन UIResponder के सभी उप-वर्ग जैसे UIViewController पहले उत्तरदाता हो सकते हैं।

के अनुसार UIResponder की Quick Help:

कई प्रमुख वस्तुओं भी UIApplication वस्तु, UIViewController पर वस्तुओं, और सभी UIView वस्तुओं (जो UIWindow भी शामिल है) सहित प्रतिसाद, कर रहे हैं। जैसे-जैसे ईवेंट होते हैं, UIKit उन्हें आपके ऐप के प्रतिसादकर्ता ऑब्जेक्ट्स को संभालने के लिए भेजता है।

और एक ही रास्ता UIResponder श्रृंखला का पालन करने का उपयोग कर UIResponder के next: UIResponder संपत्ति हो जाएगा।

उत्तरदाता श्रृंखला में अगला उत्तरदाता लौटाता है, या शून्य अगर कोई अगला उत्तरदाता नहीं है। यूआईआरस्पेन्डर क्लास स्वचालित रूप से को अगले प्रतिसादकर्ता को स्टोर या सेट नहीं करता है, इसलिए यह विधि डिफ़ॉल्ट रूप से शून्य हो जाती है। सबक्लास को इस विधि को ओवरराइड करना होगा और अगले उत्तरदाता को उचित रूप से वापस करना होगा। उदाहरण के लिए, UIView इस विधि को लागू करता है और UIViewController ऑब्जेक्ट देता है जो इसे प्रबंधित करता है (यदि इसमें कोई है) या इसके पर्यवेक्षण (यदि ऐसा नहीं है)। UIViewController समान रूप से विधि लागू करता है और इसके दृश्य का पर्यवेक्षण देता है। UIWindow एप्लिकेशन ऑब्जेक्ट देता है। यूआईपीप्लिकेशन शून्य वापस आता है।

सबसे UIKit वस्तु में superview, UIViewController, UIWindow, UIApplication या AppdelegatenextUIResponder हो जाएगा।

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 
    } 
} 

हालांकि इसके बाद के संस्करण responder के भाई बहन को ट्रैक नहीं करता। मुझे लगता है कि यदि आप वास्तव में उन सभी को ट्रैक करना चाहते हैं, तो आपको उत्तरदाता के प्रकार की जांच करने और अपने बच्चे को ट्रैक करने की आवश्यकता है (सबव्यू, बाल दृश्य नियंत्रक)।