2009-02-11 9 views
9

में पर्यवेक्षण संदेश कैसे करें मैं उद्देश्य सी और कोको में नया हूं। मुझे बस यह नहीं मिलता है कि UIView के पर्यवेक्षण को कैसे संदेश दें। मैं इसे काम नहीं कर सकता।उद्देश्य सी

मेरी MainView में मैं एक विधि नामित resetDrawType है:

- (void) resetDrawType { 
    self.drawType = foo; 
} 

इसके अलावा MainView में मैं एक subview बना सकते हैं और MainView में जोड़ें:

mySubView *mySubView = [[mySubView alloc] initWithFrame:CGRectMake(foo, foo, foo, foo)]; 
[self addSubview:mySubView]; 
[mySubView release]; 

यहाँ मैं अब तक की कोशिश की है फिर जब सबव्यूव ने अपना चित्र पूरा किया, तो मैं संदेश को रीसेट करने के लिए अपने पर्यवेक्षण में रीडटाइप भेजना चाहता हूं, जो मुख्य दृश्य है।

मैंने कोशिश की इस

[(MainView*)[self superview] resetDrawType]; 

और

[(MainView*)self.superview resetDrawType]; 

... क्या काम नहीं किया। मैंने अनौपचारिक प्रोटोकॉल के बारे में सीखा है इसलिए मैंने यह कोड मुख्य दृश्य में जोड़ा है।

@interface NSObject (resetters) 
    - (void) resetDrawType; 
@end 

लेकिन अभी भी कुछ भी नहीं। अगला मैं इस चयनकर्ता चीज़ के बारे में पता चला और subview में यह करने की कोशिश की:

if ([self.superview respondsToSelector:@selector(resetDrawType:)]) 
    [self.superview performSelector:@selector(resetDrawType) withObject:nil]; 

यह भी काम नहीं किया। मैं क्या गलत कर रहा हूं? आपकी सहायता के लिए धन्यवाद.

उत्तर

6

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

[self.superview resetDrawType]; 

अभिभावक दृश्य प्रदान करने में निम्नलिखित कार्य है;

- (void) resetDrawType { 

} 

फिर यह सही ढंग से काम करना चाहिए। अनौपचारिक प्रोटोकॉल का उपयोग करने की कोई आवश्यकता नहीं है।

इसके अलावा आपका चयनकर्ता परीक्षण गलत है क्योंकि यह "resetDrawType" फ़ंक्शन की परिभाषा से मेल नहीं खाता है। @selector (resetDrawType :) "resetDrawType" नामक फ़ंक्शन के लिए परीक्षण जो पैरामीटर पर ले जाता है, जो आपका नहीं है।

इस प्रकार आप ऊपर दिए गए फ़ंक्शन के लिए परीक्षण करेंगे;

if ([self.superview respondsToSelector:@selector(resetDrawType)]) 
    [self.superview performSelector:@selector(resetDrawType)]; 

(प्रदर्शन चयनकर्ता के बजाय आप सीधे संदेश भी भेज सकते हैं)।

+0

धन्यवाद। मैंने सीधे संदेश भेजने की कोशिश की। लेकिन इसे बुलाया नहीं जाता है। क्या पर्यवेक्षक को भी मूल दृश्य होना चाहिए? – rainerkohlberger

+0

वे दो शब्द मेरे मानसिक शब्दकोश में समानार्थी हैं। पर्यवेक्षण वह दृश्य है जिसमें आपका विचार शामिल है। आप इसका क्या मतलब कर रहे हैं? – Chuck

11

आपको अपने पर्यवेक्षण को कुछ भी नहीं बताए जाने वाले सबव्यूव्स नहीं होना चाहिए। आपको पर्यवेक्षण को अपनी दृश्य कक्षा का प्रतिनिधि बनाना चाहिए।

// MainView 
MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(...) delegate:self]; 

तो एक उदाहरण चर id delegate द्वारा घोषित करने के लिए प्रतिनिधि सहेजें।जब आप बनाना समाप्त:

// MyView 
- (void)doDrawing { 
    drawStuff(); 
    [delegate didFinishDrawingView:(MyView *)self] 
} 
अब आप अपने MainView में वापस

, इस विधि

- (void)didFinishDrawingView:(MyView *)aView; 

आप क्या चाहते करने के लिए लागू करते हैं।

यह सब बात यह है कि आपके ऐप के किनारे (छोटे साक्षात्कार की तरह) के छोटे वर्गों को यह जानने की आवश्यकता नहीं है कि उनके ऊपर बड़ी कक्षाएं कैसे काम करती हैं। यह सेटअप दृश्य को संवाद करने की अनुमति देता है, लेकिन एक संदेश के साथ जो एक संदेश के बजाय अपनी स्थिति बताता है जो किसी अन्य वस्तु को कुछ विशिष्ट करने के लिए निर्देश देता है। इस तरह कोको को संरचित किया गया है ताकि कक्षाओं को आसानी से पुन: उपयोग किया जा सके और उनकी घटनाओं को पुनर्जीवित किया जा सके, हालांकि आपको उन्हें होने की आवश्यकता है।

आपका पर्यवेक्षण पता होना चाहिए कि इसके सबव्यू समाप्त होने पर क्या करना है। सबव्यूव को सिर्फ लोगों को अपना पूरा पता होना चाहिए।


इस तरह से अपनी subview वर्ग के शीर्षक में एक उदाहरण चर घोषित करें:

id delegate; 

अपने subview वर्ग के लिए एक initiailizer कि इस तरह दिखता है लिखें:

- (id)initWithFrame:(CGRect)frame delegate:(id)aDelegate { 
    [super initWithFrame:frame]; 
    delegate = aDelegate; 
    return self; 
} 

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

+0

धन्यवाद! दुर्भाग्य से यह अभी भी काम नहीं करता है। इसके लिए: MyView * myView = [[MyView alloc] initWithFrame: CGRectMake (...) प्रतिनिधि: स्वयं]; मुझे "चेतावनी: नहीं '-initWithFrame: प्रतिनिधि:' विधि मिली" शायद मैं नहीं मानता "फिर प्रतिनिधि प्रतिनिधि को आईडी प्रतिनिधि द्वारा घोषित एक आवृत्ति चर में सहेजें"? – rainerkohlberger

+0

आपको init पर एक प्रतिनिधि (या किसी अन्य चर) को स्वीकार करने के लिए एक नया इंटियालाइज़र विधि बनाना है। मैंने इसके बारे में अधिक जानकारी के साथ अपना जवाब अपडेट कर लिया है। –