2013-02-14 27 views
15

:अधिसूचना भेजें जब एक संपत्ति मैं की तरह, एक संपत्ति मेरी कक्षा में <code>myName</code> नाम दिया का उपयोग बदल दिया है KVO

@property (nonatomic, strong) NSString *myName; 

मैं जब myName संपत्ति के मूल्य बदल गया है पर सूचना भेजने की जरूरत है।

- (void)setMyName:(NSString *)name 
{ 
    _myName = name; 
    [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; 
} 

मुझे पता है कि आईओएस में Key-Value Observing की तरह कुछ है:

अब मैं कुछ ऐसा कर रहा हूँ। लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए, मैंने पूरे दस्तावेज़ को पढ़ा, लेकिन अच्छी समझ नहीं मिली।

कृपया कस्टम सेटर का उपयोग किए बिना इसे कैसे कार्यान्वित करना है, यह समझने में मेरी सहायता करें।

उत्तर

31

इस प्रयास करें:

MyClass *var = [MyClass new]; 
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil]; 

और लागू

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 

} 

इस विधि कभी भी कॉल किया जाएगा Myname संपत्ति

+0

आपका जवाब :) –

+0

आप का स्वागत है) – alex

+0

हाय के लिए धन्यवाद, अगर KVO समाधान बेहतर तो अन्य कार्यान्वयन है मैं सोच रहा था उपाय। क्या कोई इसे समझा सकता है? – NicTesla

15

बदलता है - (void)setMyName:(NSString *)name में ऐसा करने के बजाय

[self willChangeValueForKey:@"myName"]; 
_myName = name; 
[self didChangeValueForKey:@"myName"]; 

//this generates the KVO's 

और तुम कहाँ सुनने के लिए (ViewController) चाहते हैं, viewDidLoad में इस पंक्ति जोड़ें:

[addObserver डब्ल्यू: स्वयं forKeyPath: @ "Myname" विकल्प: NSKeyValueObservingOptionNew संदर्भ: शून्य];

// ऐसा करके, आप केवीओ सुनने के लिए व्यू कंट्रोलर पंजीकृत करते हैं।

है और यह भी इस पद्धति को लागू:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { 
     return; 
    } else { 
     //read the change dictionary, and have fun :) 
    } 
} 

// इस पद्धति शुरू हो जाती है, जब भी संपत्ति के मूल्य बदल जाता है।

+0

आपके उत्तर के लिए धन्यवाद :) –

+3

यह उत्तर स्वीकार्य उत्तर से काफी बेहतर है, जो कि केवीओ को कार्यान्वित करने का तरीका नहीं दिखाता है, केवल केवीओ नोटिफ को सुनने के लिए कैसे करें जो पहले ही लागू हो चुके हैं – Chris

7

ग्राहक सेटटर के बिना ऐसा करने के लिए, बस संपत्ति सेटर को संश्लेषित करें। यह सभी सहायक कॉलों को बनाएगा करेगा ChangeValueForKey/didChangeValueForKey।

@synthesize myName;

डॉट वाक्य रचना के साथ फिर सेट संपत्ति मूल्यों:

self.myName = @ "Inigo Montoya"

तो पर्यवेक्षकों स्वचालित रूप से KVO सूचना प्राप्त होगी।

(से पहले आपको मनाया वस्तु जारी पर्यवेक्षक को दूर करने की आवश्यकता होगी।)

+0

आपके उत्तर के लिए धन्यवाद :) –