2012-05-26 19 views
5

मेरे पास टूलबार व्यू नामक एक वर्ग है जो UIView का उप-वर्ग है और मूल रूप से एक UIView बनाता है जिसमें शीर्ष पर गायब हो रहा है/पुनः दिखाई देने वाला यूआईटीयूएलबार है। मेरे पास ToolbarView का उप-वर्ग भी है जिसे DraggableToolbarView कहते हैं, उपयोगकर्ता को स्क्रीन के चारों ओर दृश्य खींचने में सक्षम बनाता है।प्रतिनिधि विरासत कार्यान्वित करने की कोशिश कर रहे हैं

मुझे टूलबार व्यू के लिए एक प्रतिनिधि बनाना होगा ताकि टूलबार फिर से दिखाई देने और गायब होने पर यह किसी अन्य ऑब्जेक्ट/क्लास को सूचित कर सके। मुझे DraggableToolbarView के लिए एक प्रतिनिधि बनाने की भी आवश्यकता है ताकि दृश्य खींचने पर मैं किसी अन्य ऑब्जेक्ट/क्लास को सूचित कर सकूं। DraggableToolbarViews प्रतिनिधि को टूलबार फिर से दिखाई देने और गायब होने के बाद किसी अन्य ऑब्जेक्ट/क्लास को सूचित करने की आवश्यकता होगी।

तो मैं ToolbarViewDelegate लागू करने का फैसला, और DraggableToolbarViewDelegate यह से विरासत और निम्नलिखित की तरह अपनी ही विधि है है

ToolbarView.h

#import <UIKit/UIKit.h> 

@protocol ToolbarViewDelegate; 

@interface ToolbarView : UIView <UIGestureRecognizerDelegate> 
{ 
    id <ToolbarViewDelegate> _toolbarViewDelegate; 
} 

@property(nonatomic, assign) id <ToolbarViewDelegate> toolbarViewDelegate; 

@end 

ToolbarView.m

#import "ToolbarView.h" 
#import "ToolbarViewDelegate.h" 

... 

- (void) showBars 
{  
     ... 
     if (self.toolbarViewDelegate) 
     { 
      [self.toolbarViewDelegate toolbarViewWillShowToolbar:self]; 
     } 

     ... 
} 

- (void) hideBars 
{ 
     ... 
     if (self.toolbarViewDelegate) 
     { 
      [self.toolbarViewDelegate toolbarViewWillHideToolbar:self]; 
     } 

     ... 
} 

टूलब arViewDelegate.h

@class ToolbarView; 

@protocol ToolbarViewDelegate 

@required 

- (void) toolBarViewWillShowToolbar:(ToolbarView *)toolbarView; 
- (void) toolBarViewWillHideToolbar:(ToolbarView *)toolbarView; 

@end 

DraggableToolbarView.h

#import "ToolbarView.h"

@protocol DraggableToolbarViewDelegate; 

@interface DraggableToolbarView : ToolbarView 
{ 
    id <DraggableToolbarViewDelegate> _draggableToolbarViewDelegate; 
} 

@property(nonatomic, assign) id <DraggableToolbarViewDelegate> draggableToolbarViewDelegate; 

@end 

DraggableToolbarView.m

#import "DraggableToolbarView.h" 
#import "DraggableToolbarViewDelegate.h" 

... 

- (void)drag:(UIPanGestureRecognizer *)sender 
{ 
    ... 
     if (self.draggableToolbarViewDelegate) 
     { 
      [self.draggableToolbarViewDelegate draggableToolbarViewWillDrag:self]; 
     } 

    ... 

} 

... 

DraggableToolbarViewDelegate.h

#import "ToolbarViewDelegate.h" 

@class DraggableToolbarView; 

@protocol DraggableToolbarViewDelegate <ToolbarViewDelegate> 

@required 

- (void) draggableToolbarViewWillDrag:(DraggableToolbarView *)draggableToolbarView; 

@end 

SomeViewController.h

#import <UIKit/UIKit.h> 
#import "ToolbarViewDelegate.h" 
#import "DraggableToolbarViewDelegate.h" 

@interface SomeViewController : UIViewController <ToolbarViewDelegate, DraggableToolbarViewDelegate> 
{ 

} 
@end 

SomeViewController.m

#import "DraggableToolbarView.h" 
... 
- (void) toolbarViewWillShowToolbar:(ToolbarView*)toolbarView 
{ 
    //NSLog(@"Toolbar Showed"); 
} 

- (void) toolbarViewWillHideToolbar:(ToolbarView*)toolbarView 
{ 
    //NSLog(@"Toolbar Hidden"); 
} 

- (void) draggableToolbarViewWillDrag:(DraggableToolbarView*)draggableToolbarView 
{ 
    //NSLog(@"Dragged"); 
} 

... 

[draggableToolbarView setDraggableToolbarViewDelegate:self]; 

... 

जब मैं यह कर केवल DraggableToolbarDelegate तरीकों प्रतिक्रिया कर रहे हैं। हालांकि जब मैं [drabbleToolbarView setToolbarViewDelegate:self] भी करता हूं तो यह काम करता है। मैंने विरासत के बिना प्रत्येक प्रतिनिधि को अलग से करने की कोशिश की है और यह ठीक काम करता है इसलिए मुझे विश्वास है कि समस्या कोड के किसी अन्य हिस्से में नहीं है।

कोई भी जानता है क्यों? मुझे प्रोटोकॉल का उत्तराधिकारी बनाकर लगा, मुझे ड्रैगगेबल टूलबार ऑब्जेक्ट के लिए टूलबार व्यूडिलेगेट भी सेट नहीं करना पड़ेगा।

अद्यतन: जोड़ा गया एक बहुत अधिक कोड

उत्तर

6

अपने कोड में, किसी भी DraggableToolbarView उदाहरण प्रतिनिधियों से कनेक्ट करने के दो गुण है, एक toolbarViewDelegate जो वह अपने सुपर क्लास से विरासत है, और एक draggableToolbarViewDelegate जो DraggableToolbarView में खुद को परिभाषित किया गया है कहा जाता है कहा जाता है। यदि आप नियंत्रक को सभी प्रतिनिधि संदेश प्राप्त करना चाहते हैं तो आपको उन दोनों को सेट करना होगा।

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

सबसे पहले, सुपरक्लास में प्रतिनिधि का नाम बदलें। (ध्यान दें कि आप की जरूरत नहीं है, और वास्तव में परेशान नहीं करना चाहिए, संपत्ति के लिए एक इवर घोषित करने के लिए - यह @synthesize द्वारा बनाई गई है।)

@interface ToolbarView : UIView <UIGestureRecognizerDelegate> 
@property (nonatomic, assign) id <ToolbarViewDelegate> delegate; 
@end 

आप उपवर्ग में एक ही प्रॉपर्टी नाम का उपयोग करेगा।

@interface DraggableToolbarView : ToolbarView 
@property (nonatomic, assign) id <DraggableToolbarViewDelegate> delegate; 
@end 

यह जब तक उपवर्ग में समर्थन इवर का नाम सुपर क्लास, जैसे की तुलना में अलग है की अनुमति दी है,

// In superclass 
@synthesize delegate; 
// In subclass 
@synthesize delegate = delegate_; 

अब दो दृश्य कक्षाओं में सभी प्रतिनिधि संदेशों को बदलने यह एक संपत्ति का उपयोग करें:

- (void)showBars 
{ 

    if (self.delegate) 
    { 
     [self.delegate ... 

- (void)drag:(UIPanGestureRecognizer *)sender 
{ 
    //... 
    if (self.delegate) 
    { 
     [self.delegate ... 

अब आप एक DraggableToolbarView को setDelegate: भेज सकते हैं और उसे खींचकर तरीकों और शो/के लिए एक ही प्रतिनिधि का उपयोग करेगा हाय डी विधियों।

अंत में, एक शब्दावली/स्पष्टीकरण नोट। your previous question के जवाब में, कालेब ने "स्टैक्ड" प्रोटोकॉल के लिए सही शब्द का उपयोग किया, और रिचर्ड ने नहीं किया। प्रोटोकॉल एक दूसरे से का उत्तराधिकारी नहीं है, लेकिन एक प्रोटोकॉल को अपनाने वाला है। रिश्ता समान है, लेकिन अलग है। जब किसी ऑब्जेक्ट प्रोटोकॉल में अनुरूप होता है, तो यह उस प्रोटोकॉल में घोषित विधियों को लागू करने का वादा करता है। प्रोटोकॉल के साथ कोई कार्यान्वयन नहीं आता है। एक दूसरे को अपनाने वाले प्रोटोकॉल के बारे में भी यही सच है - विधियों को दोनों में मौजूद होने की घोषणा की गई है।जब आप लिखें:

@protocol DraggableToolbarViewDelegate <ToolbarViewDelegate> 

आप कह रहे हैं कि किसी भी वस्तु जो DraggableToolbarViewDelegate के तरीकों को लागू करने का वादा किया भी ToolbarViewDelegate से तरीकों को लागू करेगा। इसका मतलब यह है कि इसका मतलब है। फिर, उस वादे के साथ कोई कार्यान्वयन नहीं आता है।

इस मामले में, इसका मतलब है कि DraggableToolbarView अपने प्रतिनिधि को ToolbarViewDelegate में विधियों को लागू करने की अपेक्षा कर सकता है।

+0

उस महान पोस्ट की सराहना करें। सोचो कि मैं सिर्फ प्रतिनिधियों को अलग रखने के लिए चिपक सकता हूं, न कि नामकरण की बात का एक बड़ा प्रशंसक। आप सामान्य रूप से क्या करेंगे या सिफारिश करेंगे? –

+0

खुशी है कि मैं मदद कर सकता हूं। मुझे प्रतिनिधि संपत्ति को ओवरराइड करने में कुछ भी गलत नहीं दिख रहा है; यह कोड क्लीनर के दोनों तरफ बनाता है। –

1

आपको संपूर्ण कोड नहीं दिया है, लेकिन, से जो कुछ भी यहाँ से बाहर है सुनिश्चित करें कि

  1. आपका ToolBarView और उसके उपवर्गों के रूप में एक id <ToolBarViewDelegate> प्रतिनिधि किया हुआ है सम्पत्ति।
  2. आपका DraggableToolbarViewDelegate NSObject प्रोटोकॉल को बढ़ाता है।
  3. और आपका अन्य व्यू कंट्रोलर ऑब्जेक्ट प्रतिनिधि प्रोटोकॉल के अनुरूप है और टूलबारदृश्य नहीं।
  4. एक बार आपका नियंत्रक प्रतिनिधि विधियों के कार्यान्वयन को देता है और प्रोटोकॉल के अनुरूप होता है, तो दृश्य के ऑब्जेक्ट के प्रतिनिधि को स्वयं पर सेट करें और फिर इन प्रोटोकॉल विधियों को कॉल करने के लिए दृश्य में प्रतिनिधि संपत्ति सेट का उपयोग करें।
संबंधित मुद्दे