2012-02-13 4 views
6

मेरे पास एक दृश्य नियंत्रक है जो एक दृश्य के साथ है (उदाहरण के लिए), और मैं किसी भी दृश्य के फ्रेम का निरीक्षण करना चाहता हूं जो self.view पर सेट है। वहाँ के बीच कोई अंतर है:केवीओ में कीपैथ के रूप में क्या उपयोग करें?

[self.view addObserver:self forKeyPath:@"frame" options:0 context:nil]; 

और

[self addObserver:self forKeyPath:@"view.frame" options:0 context:nil]; 

दूसरा एक के लिए, दृश्य परिवर्तन संदेश अभी भी प्राप्त हो जाएगा अगर जब नए दृश्य के फ्रेम में परिवर्तन, या यह केवल संदेशों यदि भेज देंगे पर्यवेक्षक को जोड़ा गया था जब दृश्य का फ्रेम सेट किया गया था?

क्या फ्रेम नियंत्रक में परिवर्तनों का निरीक्षण करने का कोई तरीका है भले ही दर्शक नियंत्रक के दृश्य को पर्यवेक्षक जोड़ने के बाद बदल जाए?

उत्तर

7

दूसरा पथ का उपयोग करें। @"view.frame" आपको "दृश्य" स्वयं बदलते समय भी फ्रेम परिवर्तनों के बारे में सूचित करेगा। कोको स्वचालित रूप से आपके लिए कीपैथ "चेन" में प्रत्येक ऑब्जेक्ट के लिए पर्यवेक्षक जोड़ देगा (जिसका अर्थ है कुंजीपैथ में प्रत्येक आइटम केवीओ-संगत होना चाहिए)।

पहले एक

कहते हैं, "मुझे एक दृश्य के रूप में", मैं जोड़ें:

+0

हां, सच है, की सर्वशक्तिमान सत्ता केवीओ खुलासा किया गया था! –

2

आप जवाब है हाँ, उन दोनों के बीच एक अंतर है, तो इन दोनों के बीच एक अंतर है पूछा स्वयं (उर्फ) व्यू कंट्रोलर ऑब्जेक्ट नामक एक पर्यवेक्षक, यदि आपने इसे "फ्रेम" नामक मेरी संपत्ति को बदल दिया है तो नियंत्रक.एम में इसे आमंत्रित किया है।

दूसरा एक

"ViewController के रूप में मुझे" कहते हैं जब भी theKeyPath नाम "view.frame" बदल गया है मैं myselfAsAnObserver जोड़ रहा।

के बाद से हर पर्यवेक्षक

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

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

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

एक और बात को लागू करना चाहिए: इसका एक अच्छा विचार अवलोकन के लिए एक संदर्भ बनाने के लिए जैसे

//In MyViewController.m 

//.. 
static int observingViewFrameContext 


// In ... 
[self addObserver:self 
     forKeyPath:@"view.frame" 
      options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 
      context:&observingViewFrameContext]; 


// .. don' forget to remove an observer ! too 
संबंधित मुद्दे