2011-06-15 9 views
6

मैं NSObject के उपवर्ग होने 70 गुण, मैं प्रत्येक संपत्ति एक-एक करके निम्न का उपयोग कर जोड़ने के बिना उन सभी को में परिवर्तन निरीक्षण करने की आवश्यकता है:NSObject गुण में परिवर्तन को ध्यान कैसे

[self addObserver: self 
     forKeyPath: @"propertyname" 
      options: NSKeyValueObservingOptionNew 
      context: NULL]; 

। कृपया मुझे ऐसा करने का सबसे आसान तरीका बताएं। अभी, मुझे 10.5 और बाद में समाधान की आवश्यकता है।

उत्तर

10

आप उस वर्ग के सभी गुण प्राप्त करने के लिए उद्देश्य-सी रनटाइम फ़ंक्शन class_copyPropertyList() का उपयोग कर सकते हैं, फिर सूची के माध्यम से लूप करें और property_getName() का उपयोग करें जो कुछ महत्वपूर्ण मूल्य के साथ काम करना चाहिए।

या आप कक्षा में keyPathsForValuesAffectingValueForKey: लागू कर सकते हैं। कक्षा पर एक नई कुंजी बनाएं, कि हम केवल परिवर्तन पहचान के लिए उपयोग करने जा रहे हैं। फिर उपर्युक्त विधि को लागू करें, और यदि पारित स्ट्रिंग आपकी नई कुंजी के बराबर है, तो सभी सत्तर गुणों के नाम वाले एक सेट को वापस करें। फिर आप अपनी नई कुंजी पर केवीओ कर सकते हैं, और कुछ भी बदलते समय आपको अधिसूचित किया जाएगा। इसे इस तरह से करना, आपको नहीं पता होगा कि कौन सी संपत्ति बदल गई, बस उनमें से एक ने किया।

यह हमें यह बताने में मदद कर सकता है कि आपको ऐसा करने की आवश्यकता क्यों है, क्योंकि उपयोग करने के लिए एक बेहतर डिजाइन पैटर्न हो सकता है।

+0

आपके मूल्यवान उत्तर के लिए धन्यवाद। मेरी कक्षा संपत्तियां XIB में कई यूआई नियंत्रणों से सीधे बंधी हुई हैं। मुझे उपयोगकर्ताओं को वर्तमान यूआई नियंत्रण में परिवर्तन का पता लगाने की अनुमति देने की आवश्यकता है और यदि वे वर्तमान मूल्यों को सहेजे बिना मुख्य XIB को बंद करते हैं तो परिवर्तनों को सहेजने के लिए उपयोगकर्ता को सूचित करें। जैसा कि आप उल्लेख करते हैं, मैं इसे लागू करने की कोशिश करूंगा और अगर यह मेरे लिए काम करता है तो मुझे बताएगा। – AmitSri

+0

यह देखते हुए कि केस का उपयोग करें, मैं वास्तव में ऐसा करने का एक बेहतर तरीका बनना चाहता हूं। मैं NSObjectController के आस-पास पढ़ रहा हूं, यदि आप जो चाहते हैं वह करता है, लेकिन मुझे उन स्थितियों के लिए अधिक जानकारी नहीं मिल रही है जहां आप कोर डेटा का उपयोग नहीं कर रहे हैं। मैंने यह कोशिश नहीं की है, लेकिन यह एक विचार की तरह लगता है: एनएसओब्जेक्ट कंट्रोलर सबक्लास बनाएं, आईबी में तत्काल करें, और अपनी सामग्री ऑब्जेक्ट को अपने एनएसओब्जेक्ट के रूप में सेट करें। उसी कुंजी के साथ, अपने सभी UI को NSObjectController पर बाध्य करें। फिर, कोड में, अपने ऑब्जेक्टर सबक्लास पर 'objectDidEndEditing: 'को ओवरराइड करें, और जो भी कक्षा को सहेजना चाहिए उसे एक विधि पर कॉल करें। –

+0

आपके सुझाव के लिए धन्यवाद, मैं देखता हूं कि भविष्य में आपके कार्यान्वयन को मैं भविष्य में बदल सकता हूं या नहीं। वर्तमान में, मैंने सुझाव दिया है कि मैंने keyPathsForValuesAffectingValueForKey को लागू किया है और यह अब मेरे लिए काम करता प्रतीत होता है। – AmitSri

संबंधित मुद्दे