2010-02-17 15 views
14

मैं एक दृश्य आधारित जीयूआई कि प्रत्येक जीयूआई आइटम के लिए एक पाठ क्षेत्र शामिल है समाप्त करने के लिए एक कोको पाठ क्षेत्र जबरदस्ती। जब मैं एक और मेनू आइटम चुनता हूं, तो मैं अपने टेक्स्ट फ़ील्ड को संपादन मोड से बाहर निकलने के लिए चाहता हूं। मैं nsTextField दस्तावेज़ों में ऐसा करने के लिए वैसे भी नहीं मिला। कोई विचार?संपादन

[[textField window] makeFirstResponder:nil]; 

यह संपादन समाप्त हो जाएगा और पाठ क्षेत्र से फोकस हटा दें:

उत्तर

39

आप नियंत्रण से पहले प्रत्युत्तर स्थिति को दूर करने के खिड़की बताने के लिए की जरूरत है।

+0

यह एक सामान्य प्रश्न – uchuugaka

+2

काम नहीं करता (कम से कम Yosemite में) होना चाहिए। –

+1

यहां योसामेट में ठीक काम करता है। क्या आप मुख्य धागे से बुला रहे हैं? \t 'dispatch_async (dispatch_get_main_queue(),^{[textField.window makeFirstResponder: nil];});' –

11

cocoabuilder.com - Stop edit session with a NSTextField से निम्नलिखित समाधान ऑब्जेक्टिव सी के लिए ओएस एक्स 10.9 और ओएस एक्स 10.10 पर और स्विफ्ट के लिए 10.10 पर दोनों के लिए काम करता है।

@implementation CustomTextField 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 

    self.target = self; 
    self.action = @selector(action:); 

    return self; 
} 

- (void)action:(NSTextField *)textField { 
    // Make something else first responder, something neutral 
    // (or can be a fake invisible element) 
    [self.window makeFirstResponder:self.window.contentView]; 

    // Other code 
} 

@end 

पृष्ठभूमि::

यहाँ ऑब्जेक्टिव-सी संस्करण है इस विषय [[textField window] makeFirstResponder:nil]; बुला के रूप में यह पता चलता है की इतना बजाय ओएस एक्स 10.9 और 10.10 पर मेरे लिए काम नहीं में स्वीकार किए जाते हैं समाधान - मैं के साथ makeFirstResponder कॉल करने के लिए की जरूरत कुछ गैर शून्य NSResponder उपवर्ग (यह या तो NSWindow की सामग्री देखने या NSViewController का दृष्टिकोण हो सकता है कि मेरे मामले या कुछ नकली NSTextField दृश्य जो अधिक जटिल मामलों के लिए उपयोगकर्ता को दिखाई नहीं देता में दोनों काम)।

महत्वपूर्ण विवरण: -[NSWindow makeFirstResponder] वास्तव में एनएसटीक्स्टफिल्ड के एक्शन चयनकर्ता के भीतर लागू किया जाना चाहिए जैसे कि मेरा उदाहरण प्रदर्शित करता है। NSTextField विधि पाइपलाइन में कोई अन्य स्थान मेरे लिए काम नहीं करता है (textDidEndEditing :, textShouldEndEditing: या नियंत्रण: textShouldEndEditing :)

+1

भी अजीब हालांकि पहले प्रत्युत्तर स्थिति को स्वीकार कर सकते हैं, यह भी एकमात्र समाधान है कि मेरे लिए काम किया था। – Christian

+1

वास्तव में यह है, जबकि स्वीकार किए जाते हैं जवाब आप viewWillLayout में ऊपर जवाब से विधि बुलाया था, तो ऐसा नहीं करता Yosemite –

+0

में काम करता है, आप किसी भी उपवर्गों बनाए बिना एक पंक्ति में सब कुछ किया होता। – iSavaDevRU

4

मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर कोई तेजी से 3 के बारे में सोच रहा है, तो यह केवल मेरे लिए काम करता है
DispatchQueue.main.async{ self.window?.makeFirstResponder() }

+1

वाह! तुमने मेरी जान बचाई! – Vincenso

+0

मुझे अपने जीवन को बचाने के बारे में पता नहीं है लेकिन इससे वास्तव में मदद मिली। :) मैं यह भी इंगित करना चाहता हूं कि मेरे मामले में यह नहीं बनाया गया था फर्स्ट रेस्पॉन्डर लेकिन इस्तीफा देना फर्स्ट रेस्पॉन्डर जिसे डिस्पैच कतार में लपेटना था। – Chris

0

साथ यह आदेश viewWillLayout में इस्तेमाल किया जाना चाहिए और अगर viewWillAppear और में की जरूरत है। और बस यही। कोई सबक्लास और समानांतर धागे नहीं।

[textField.window makeFirstResponder:nil]; 

यह मुख्य विंडो के साथ अच्छी तरह से काम करता है। लेकिन यह मोडल विंडोज़ के साथ अच्छी तरह से काम नहीं करता है।

मोडल खिड़कियों के लिए viewDidAppear या dispatch_async का उपयोग करें:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [textField.window makeFirstResponder:nil]; 
    }); 
संबंधित मुद्दे