2010-09-16 15 views
10

मैं कोको के साथ नौसिखिया हूं। मेरे पास मेरे ऐप में एक बटन और टेक्स्टफिल्ड है। जब मैं टेक्स्ट टाइप करता हूं तो बटन अक्षम होता है और जब उपयोगकर्ता कुछ टाइप करता है तो सक्षम होता है।एनएसटीक्स्टफील्ड खाली होने पर एनएसबटन को अक्षम/सक्षम करें या

कोई भी बिंदु शुरू करने के लिए? इंटरफ़ेस बिल्डर में कोई भी "जादू" बाध्यकारी?

धन्यवाद

[संपादित]

मैंने AppDelegate NSTextfield's प्रतिनिधि के रूप में स्थापित करने के लिए कोशिश की और इस विधि (myTextfield और myButton IBOutlets कर रहे हैं) कहा:

- (void)textDidChange:(NSNotification *)aNotification 
{ 
    if ([[myTextField stringValue]length]>0) { 
     [myButton setEnabled: YES]; 
    } 
    else { 
     [myButton setEnabled: NO]; 
    } 
} 

लेकिन कुछ भी नहीं होता ...

+0

आप के साथ एक ही बात की कोशिश कर सकता है? – jv42

उत्तर

13

मैंने ऐपडिलेगेट को एनएसटीक्स्टफील्ड के प्रतिनिधि के रूप में सेट करने की कोशिश की है और टी उसकी विधि (myTextfield और myButton IBOutlets हैं):

- (void)textDidChange:(NSNotification *)aNotification 
{ 
    if ([[myTextField stringValue]length]>0) { 
     [myButton setEnabled: YES]; 
    } 
    else { 
     [myButton setEnabled: NO]; 
    } 
} 

कठिन रास्ता है कि है, लेकिन यह ठीक काम करना चाहिए। या तो आपने इस ऑब्जेक्ट के टेक्स्ट फ़ील्ड के delegate आउटलेट को नहीं जोड़ा है, आपने टेक्स्ट फ़ील्ड में myTextField आउटलेट को नहीं जोड़ा है, या आपने बटन पर myButton आउटलेट को नहीं जोड़ा है।

अन्य तरीके से, नियंत्रक एक संपत्ति स्ट्रिंग मान उजागर देना पाठ क्षेत्र के value इस stringValue संपत्ति के लिए बाध्य बाँध, और बाँध बटन के enabled नियंत्रक के stringValue.length के लिए बाध्य होगा।

आप नियंत्रक को दो गुण भी दे सकते हैं, जिसमें एक बूलियन मान है, और इसे स्ट्रिंग प्रॉपर्टी पर निर्भर के रूप में सेट करें, और उस बटन को बाध्य करें। यह एक क्लीनर और संभवतः अधिक मजबूत समाधान है, हालांकि यह अधिक काम है।

+1

हैलो पीटर। कुछ महीनों के बाद मुझे इसे एक और ऐप के साथ फिर से हल करने की आवश्यकता है। अब जब बाइंडिंग (और कोको) के बारे में मेरा ज्ञान बेहतर है, मैंने आपके समाधान की कोशिश की है और यह सही काम करता है। और बस एक संपत्ति और दो बाइंडिंग के साथ! (प्रतिनिधि विधियों, पर्यवेक्षकों और दुकानों का उपयोग करने से अधिक क्लीनर ...) बहुत बहुत धन्यवाद – Azpiri

0

धन्यवाद पीटर।

NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
[center addObserver:self selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification object:myTextField]; 

यह सही काम करता है: क्या मैं याद किया (मेरी मुश्किल तरीके संस्करण में) AppDelegate में awakeFromNib में कोड के इस टुकड़े है। अब मैं आसान तरीका कोशिश कर रहा हूं, लेकिन मुझे डर है कि मैं अभी भी बाइंडिंग के साथ पर्याप्त नहीं हूं। , "नियंत्रक कुंजी" और "मॉडल कुंजी पथ":

संपत्ति

@property (retain) IBOutlet NSString *aStringValue; 
textfield's मूल्य के साथ

, क्या मैं के लिए आईबी में उपयोग करने के लिए "के प्रति आबद्ध" बाँध के लिए?

3

यदि आप textDidChange के बजाय controlTextDidChange का उपयोग करते हैं, तो आप अधिसूचना सामग्री से छुटकारा पा सकते हैं और बस NSTextField के प्रतिनिधि होने पर भरोसा कर सकते हैं।

9

यहां बाइंडिंग का उपयोग करके एक समाधान है।

नीचे मैं एक एनएसटीक्स्टफिल्ड सेट करता हूं जो फ़ाइल स्वामी की "टेक्स्ट" संपत्ति से जुड़ा हुआ है। "टेक्स्ट" एक एनएसएसटींग है। मुझे "निरंतर अद्यतन मूल्य" द्वारा पकड़ा गया था। सोच रहा है कि मेरा समाधान काम नहीं करता है, लेकिन वास्तव में यह उपयोगकर्ता टाइप किए जाने के रूप में अपडेट नहीं हो रहा था, और केवल तभी जब टेक्स्टफील्ड फोकस खो गया था।

Binding the NSTextField to the file's owner NSString text property

और अब बटन पर बाइंडिंग की स्थापना के लिए, बस फ़ाइल स्वामी के पाठ संपत्ति की लंबाई करने के लिए अपने सक्षम राज्य की स्थापना की।

Binding the NSButton's enabled state to the text property's length

ANND, काम कर रहे उत्पाद। इसके बजाय अपने हालत में: [@ "" myTextField.text isEqualToString]

enter image description here enter image description here

+0

दुर्भाग्यवश यूआई ने एक्सकोड 8 में थोड़ा बदलाव किया है। मैंने एक संपत्ति 'डायनामिक var टेक्स्ट: एनएसएसटींग' बनाई और 'self.text' को बांधने में सक्षम था पाठ क्षेत्र में, लेकिन मुझे दूसरा भाग काम नहीं मिल सका। आप 'नियंत्रक कुंजी' के लिए क्या डालते हैं? – wcochran