2012-01-25 7 views
15

मेरे पास UIScrollView है जो मुझे उप-वर्ग के भीतर और उप-वर्ग के भीतर की आवश्यकता है, मुझे UIScrollViewDelegate संलग्न करने की आवश्यकता है, इसलिए मैं viewForZoomingInScrollView विधि को कार्यान्वित कर सकता हूं।प्रति ऑब्जेक्ट एकाधिक प्रतिनिधि?

तो मैं एक UIViewController जहां मैं इस UIScrollView उपवर्ग है कि मैं बनाया का एक उद्देश्य का दृष्टांत की जरूरत है, और मैं भी इस वस्तु के लिए UIViewController एक UIScrollViewDelegate बनाने के लिए तो मैं इस UIViewController कक्षा में scrollViewDidZoom लागू कर सकते हैं करना चाहते हैं।

एक ऑब्जेक्ट को दो प्रतिनिधि बनाने के लिए कैसे संभव है? (मुझे पता है कि मैं आसानी से सिर्फ एक प्रतिनिधि हो सकता हूं और केवल दोनों विधियों को लागू कर सकता हूं, लेकिन डिजाइन उद्देश्यों के लिए मैं इसे जिस तरह से उल्लेख कर रहा हूं उसे करना चाहता हूं)।

+0

आप ऐसा क्यों करेंगे? आप अपने कस्टम एसक्रॉल व्यू से अपने वीसी में एक संदेश क्यों नहीं पारित कर सकते हैं जिसमें एसवी (दूसरे (कस्टम) प्रतिनिधि के साथ) है? –

+0

शायद मुझे ऐसा करने की ज़रूरत है, इसलिए यदि मैंने अपने एसवी सबक्लास में scrollViewDidZoom लागू किया है, तो जब भी यह ट्रिगर होता है तो मैं अपना वीसी संदेश कैसे भेज सकता हूं? @totumus maximus –

+0

आपको अपने कस्टम व्यू में एक कस्टम प्रतिनिधि (प्रोटोकॉल) बनाना होगा और इसके वीसी प्रतिनिधि को बनाना होगा। फिलहाल आपके स्क्रॉलव्यू प्रतिनिधियों को बुलाया जाता है, आप अपने कस्टम प्रतिनिधि में कस्टम प्रतिनिधि विधियों में से एक को भी कॉल करते हैं। इस तरह स्क्रोलव्यू स्वयं की ज़िम्मेदारी रखता है और आपके मूल दृश्य को विशेष स्क्रॉल फ़ंक्शन पर प्रतिक्रिया प्राप्त होती है। मैं इसे यहा के जवाब में डाल दूंगा। –

उत्तर

7

आप 2 प्रतिनिधि के साथ कोई ऑब्जेक्ट नहीं चाहते हैं। आप अपने कस्टमस्क्रॉलव्यू को अपने स्वयं के UIScrollViewDelegate फ़ंक्शंस की ज़िम्मेदारी रखना चाहते हैं।

अपने parentVC को UIScrollView के प्रतिनिधि तरीकों का जवाब देने के लिए आपको अपने कस्टमस्क्रॉल व्यू के अंदर एक कस्टम प्रतिनिधि बनाना होगा।

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

यह कुछ हद तक दिखाई देगा।

CustomScrollView.h

@protocol CustomDelegate <NSObject> 

//custom delegate methods 
-(void)myCustomDelegateMethod; 

@end 

@interface CustomScrollView : UIScrollView <UIScrollViewDelegate> 
{ 
    id<CustomDelegate> delegate 
    //the rest of the stuff 

CustomScrollView.m

-(void) viewForZoomingInScrollView 
{ 
    [self.delegate myCustomDelegateMethod]; 
    //rest of viewForZoomingInScrollView code 

ParentVC।ज

@interface CustomScrollView : UIViewController <CustomDelegate> 
{ 
    //stuff 

ParentVC.m

-(void)makeCustomScrollView 
{ 
    CustomScrollView *csv = [[CustomScrollView alloc] init]; 
    csv.delegate = self; 
    //other stuff 

} 

-(void)myCustomDelegateMethod 
{ 
    //respond to viewForZoomingInScrollView 
} 

मुझे आशा है कि यह पूरी तरह से आपकी समस्या को शामिल किया गया। शुभकामनाएँ।

+0

इसे लिखने के लिए धन्यवाद। –

+0

^^ –

+2

@TotumusMaximus की मदद करने के लिए हमेशा खुश रहें, स्क्रॉलव्यू में पहले से ही "प्रतिनिधि" नाम की एक संपत्ति है, यहां आप एक ही नाम के साथ एक संपत्ति घोषित करने का प्रयास करते हैं, जो बीएडी – onmyway133

2

मुझे नहीं लगता कि आपके पास एक ही ऑब्जेक्ट से सीधे जुड़े दो UIScrollViewDelegate प्रतिनिधि हो सकते हैं।

आप क्या कर सकते हैं दो प्रतिनिधि श्रृंखला-जुड़े हुए हैं। यानी, आप एक प्रतिनिधि को दूसरे से जोड़ते हैं, फिर बाद वाले को अग्रेषित संदेश भेजें जब यह उन्हें सीधे संभाल नहीं सके।

किसी भी मामले में, मुझे लगता है कि मुझे समाधान का पूरी तरह से सुझाव देने के लिए थोड़ा सा याद आ रहा है, यानी कारण आपको दूसरे प्रतिनिधि की आवश्यकता क्यों है और हमेशा एक ही प्रतिनिधि के माध्यम से नहीं कर सकता है। दूसरे शब्दों में, मुझे लगता है कि वैकल्पिक डिजाइन हो सकते हैं जो दो प्रतिनिधियों की आवश्यकता से बचें।

3

संक्षिप्त उत्तर: आप नहीं करते हैं।

@property (nonatomic, weak /*or assign*/) id<MyViewDelegate> delegate; 

कभी कभी तुम एक "श्रोता" डिजाइन पैटर्न देखेंगे, जो प्रतिनिधियों में से एक-से-अनेक रूप है::

- (void) addListener:(id<MyViewListener>)listener; 
- (void) removeListener:(id<MyViewListener>)listener; 

में प्रतिनिधियों को आम तौर पर एक कमजोर एक-से-एक संबंध हैं आपका मामला, UIScrollView में एक अच्छा सार्वजनिक ओवरराइड पॉइंट प्रतीत नहीं होता है जो उपclasses को ViewForZoomingInScrollView निर्दिष्ट करने की अनुमति देता है। यदि संभव हो, तो मैं UIScrollView को अपने प्रतिनिधि को बनाने से बचूंगा। आप UIViewController को UIScrollViewDelegate बना सकते हैं और इसे ViewForZooming प्रदान कर सकते हैं। या आप एक इंटरमीडिएट व्यू सबक्लास बना सकते हैं जो UIScrollView का उपयोग करता है, दृश्य फॉरज़ूमिंग प्रदान करता है, और आगे के अन्य प्रतिनिधि तरीकों को आगे बढ़ाता है।

12

कभी-कभी स्क्रॉल व्यू में कई प्रतिनिधियों को संलग्न करना समझ में आता है। उस मामले में आप एक सरल प्रतिनिधिमंडल विभाजक का निर्माण कर सकते हैं:

// Public interface 
@interface CCDelegateSplitter : NSObject 

- (void) addDelegate: (id) delegate; 
- (void) addDelegates: (NSArray*) delegates; 

@end 

// Private interface 
@interface CCDelegateSplitter() 
@property(strong) NSMutableSet *delegates; 
@end 

@implementation CCDelegateSplitter 

- (id) init 
{ 
    self = [super init]; 
    _delegates = [NSMutableSet set]; 
    return self; 
} 

- (void) addDelegate: (id) delegate 
{ 
    [_delegates addObject:delegate]; 
} 

- (void) addDelegates: (NSArray*) delegates 
{ 
    [_delegates addObjectsFromArray:delegates]; 
} 

- (void) forwardInvocation: (NSInvocation*) invocation 
{ 
    for (id delegate in _delegates) { 
     [invocation invokeWithTarget:delegate]; 
    } 
} 

- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector 
{ 
    NSMethodSignature *our = [super methodSignatureForSelector:selector]; 
    NSMethodSignature *delegated = [(NSObject *)[_delegates anyObject] methodSignatureForSelector:selector]; 
    return our ? our : delegated; 
} 

- (BOOL) respondsToSelector: (SEL) selector 
{ 
    return [[_delegates anyObject] respondsToSelector:selector]; 
} 

@end 

तो बस पुस्तक को देखने के एक प्रतिनिधि के रूप में इस विभाजक की एक आवृत्ति की स्थापना की और विभाजक के प्रतिनिधियों के किसी भी संख्या देते हैं। उनमें से सभी प्रतिनिधिमंडल कार्यक्रम प्राप्त करेंगे। कुछ चेतावनी लागू होती हैं, उदाहरण के लिए सभी प्रतिनिधियों को एक ही प्रकार का माना जाता है, अन्यथा आपको बेवकूफ respondsToSelector कार्यान्वयन के साथ परेशानी होगी। यह एक बड़ी समस्या नहीं है, कार्यान्वयन को बदलने के लिए केवल उन लोगों को प्रतिनिधिमंडल कार्यक्रम भेजने के लिए आसान है जो उन्हें समर्थन देते हैं।

+0

है, इसे @property (असाइन) CCDelegateSplitter की तरह घोषित किया जाना चाहिए * प्रतिनिधियों? एक [एनएसएमयूटेबलसेट सेट] के बजाय –

+2

; [NSHashTable हैशटेबलविथऑप्शन: NSPointerFunctionsWeakMemory] का उपयोग करें; क्योंकि यह प्रतिनिधि वस्तुओं के लिए एक कमजोर संदर्भ रखेगा और उनके लिए बनाए रखने चक्र से बच जाएगा – Nav

+0

इस समाधान का उपयोग न करें, प्रतिनिधियों को संदर्भ के कारण हटाया नहीं जा सकता है। नेविगेशन का सुझाव दिया, एनएसएनोटिफिकेशन, या कुछ और। बस यह नहीं ... –

0

यहाँ एक सुंदर 2 प्रतिनिधियों को शामिल समाधान है:

  • कस्टम स्क्रॉल दृश्य वर्ग LTInfiniteScrollView उपवर्गों UIView (नहीं UIScrollView) और एक बच्चे के रूप में एक UIScrollView कहते हैं। LTInfiniteScrollView स्वयं को UIScrollView के प्रतिनिधि के रूप में सेट करता है।

  • LTInfiniteScrollView अपनी delegate संपत्ति और प्रोटोकॉल को परिभाषित करता है। चूंकि LTInfiniteScrollViewUIScrollView उपखंड नहीं था, तो मौजूदा delegate संपत्ति के साथ संघर्ष करने के लिए कोई मौजूदा स्थान नहीं है।