2012-05-15 27 views
5

अद्यतन नहीं करता है मेरे पास मेरे मॉडल के लिए एक NSTextField है। यदि मैं प्रोग्राम फ़ील्ड की सामग्री को प्रोग्रामेटिक रूप से बदलता हूं, तो मॉडल अपडेट नहीं होता है। मुझे पता है कि आपको update the model instead माना जाता है।कोको बाइंडिंग के साथ, एनएसटीक्स्टफिल्ड के मूल्य को प्रोग्रामेटिक रूप से बदलना मॉडल

लेकिन मैं एक एनएसटीक्स्टफाल्ड सबक्लास को लागू करने की कोशिश कर रहा हूं जो स्क्रॉल को पहचानता है जबकि माउस इसके संख्यात्मक मूल्य को बदलने के लिए इसके ऊपर हो रहा है। जाहिर है, मेरे पास इस सबक्लास से मॉडल तक पहुंच नहीं है। तो आपके पास कोई सुझाव है कि मैं यह कैसे कर सकता हूं?

समाधान (नोआ करने के लिए धन्यवाद):

- (void)scrollWheel:(NSEvent *)theEvent { 
    [self setFloatValue:[self floatValue] - [theEvent deltaY]]; 
    NSDictionary *bindingInfo = [self infoForBinding: NSValueBinding]; 
    NSObject *boundObject = [bindingInfo valueForKey:NSObservedObjectKey]; 
    NSString *keyPath = [bindingInfo valueForKey:NSObservedKeyPathKey]; 
    [boundObject setValue:[NSNumber numberWithFloat:[self floatValue]] 
       forKeyPath:keyPath]; 
} 

उत्तर

6

आप कर सकते थे या तो उपयोग लक्ष्य कार्रवाई या कोको बाइंडिंग:

  1. लक्ष्य कार्रवाई: कुछ करने के लिए पाठ क्षेत्र की कार्रवाई चयनकर्ता कनेक्ट अद्यतन नियंत्रक की वैल्यू कार्रवाई। फिर, टेक्स्ट फ़ील्ड में, टेक्स्ट फ़ील्ड के मान को बदलने के बाद चयनकर्ता को आमंत्रित करें। कार्रवाई को टेक्स्ट फ़ील्ड के मूल्य को लाया जाना चाहिए और इसे मॉडल में प्रचारित करना चाहिए।

  2. कोको बाइंडिंग्स: टेक्स्ट ऑब्जेक्ट की एक केवीओ-अनुरूप संपत्ति को टेक्स्ट फ़ील्ड का मान बाध्यकारी सेट करें। फिर आप सेल के मान को अपडेट कर सकते हैं और बाइंडर आपके लिए मॉडल ऑब्जेक्ट अपडेट करेगा।

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

मैं शायद बाइंडिंग का उपयोग करता हूं, जो मैं कम काम मानता हूं, लेकिन लक्ष्य-क्रिया पूरी तरह से ठीक है, और थोड़ा और सीधा है।


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

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding]; 
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue 
              forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]]; 
+0

जैसा कि मैंने कहा, मैं बाइंडिंग का उपयोग कर रहा हूं। मेरा टेक्स्ट फ़ील्ड का मान मेरे मॉडल ऑब्जेक्ट की केवीओ-अनुरूप संपत्ति से जुड़ा हुआ है। मेरी समस्या यह है कि बाध्यकारी केवल मॉडल ऑब्जेक्ट की संपत्ति को अद्यतन करता है जब मैं टेक्स्ट फ़ील्ड के मान को हाथ से बदलता हूं, लेकिन जब यह प्रोग्रामेटिक रूप से परिवर्तित नहीं होता है। – DrummerB

+0

मेरी गलती, मैंने सोचा कि बाध्य नियंत्रणों के प्रोग्रामेटिक अपडेट मॉडल को अपडेट करते हैं। मैं पोस्ट करने के लिए कुछ कोड की तलाश करूंगा। – paulmelnikow

+0

दुर्भाग्य से यह मामला नहीं है। सहायता का प्रयास करने के लिए धन्यवाद! – DrummerB