2010-07-25 15 views
5

मुझे एक व्यू कंट्रोलर क्लास (MyViewController) मिला जो UIView सबक्लास (MyView) से संबंधित है। मैं दृश्य नियंत्रक वर्ग को छोड़कर किसी भी वर्ग को UIView सबक्लास के बारे में नहीं जानना चाहता, इसलिए मैं MyView.hMyViewController.h में आयात नहीं कर सकता।उद्देश्य-सी "निजी" प्रोटोकॉल?

तो, MyViewController.m में, मैं

#import "MyViewController.h" 
#import "MyView.h" 

@interface MyViewController (PrivateObjects) 

MyView *myView; 

@end 

... 

डाल हालांकि, MyView की प्रतिक्रिया प्राप्त करने, मैं एक प्रतिनिधि का उपयोग करें। उस प्रतिनिधि को MyViewDelegate प्रोटोकॉल को कार्यान्वित करना है।

मैं #importMyView.hMyViewController.h में बिना MyViewController अंदर MyViewDelegate प्रोटोकॉल कैसे लागू कर सकते हैं?

उत्तर

14
@interface MyViewController (PrivateObjects) <MyViewDelegate> 
.... 

[नीचे bbum से सुझाव भी शामिल है]

0

MyView.h के बाहर एक प्रोटोकॉल (ज) बनाएं और उनका उपयोग कि MyViewController की घोषणा ( ज) में, उदाहरण के लिए:

#import "MyViewDelegate.h" 
@interface MyViewController : UIViewController <MyViewDelegate> 

--Frank

+0

प्रतिनिधि एक विधि 'शामिल क्या होगा अगर (BTW, आप एक नया इवर एक वर्ग में घोषित नहीं कर सकते हैं।) - (शून्य) MyView : (MyView *) myView textDidChange: (NSString *) text'? – ryyst

2

आप कर सकते हैं MyViewController.h

@class MyView; 

@interface MyViewController { 
    MyView *myView; 
} 

@end 
-4

में एक फ़ोरवेयर-घोषणा का उपयोग क्यों करें आप प्रोटोकॉल का उपयोग क्यों करना चाहते हैं? बस अपनी निजी ऑब्जेक्ट्स श्रेणी में विधियां डालें।

संपादित: एप्पल के रूप में "informal protocol"

+0

क्योंकि "केवल विधियों को डालने" खराब प्रोग्रामिंग शैली है, साथ ही 'MyView' को पुन: प्रयोज्य किया जाना चाहिए, इसलिए यहां एक प्रतिनिधि निश्चित रूप से उपयोगी है। – ryyst

+0

आह, ऐसा लगता है कि मुझे गलत समझा जाता है "मैं व्यू कंट्रोलर क्लास को छोड़कर किसी भी वर्ग को यूआईवीव सबक्लास के बारे में नहीं जानना चाहता" – user123444555621

1

इस तकनीक मैं जानता हूँ कि यह अजीब लग मेरे लिए संदर्भित करता है, लेकिन अनुभव से मैं आपको बता कोको में गोपनीयता पदानुक्रम के बारे में इतना परेशान नहीं है कर सकते हैं।

तो एक ऐप में या आंतरिक रूपरेखाओं में बस कक्षा को दस्तावेज करते हुए बताते हैं कि इसका उपयोग कैसे किया जाना चाहिए।

ऐसा इसलिए है क्योंकि आपके पास वास्तविक गोपनीयता नहीं हो सकती है क्योंकि लंबे सी पॉइंटर्स चारों ओर हैं इसलिए उद्देश्य-सी को कोई वाक्यविन्यास नहीं बनाया गया था जो आपको केवल कुछ भ्रम देगा।

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

+0

यह नहीं है कि निजी कार्यान्वयन के लिए भाषा समर्थन में अपर्याप्त है, यह बहुत अधिक है भाषा को गोपनीयता के भ्रम पैदा करने के लिए * कचरा वाक्यविन्यास के लिए डिज़ाइन नहीं किया गया है, जो कि आपके पास सी आधारित भाषा में भी है। – bbum

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