मेरे पास टूलबार व्यू नामक एक वर्ग है जो 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]
भी करता हूं तो यह काम करता है। मैंने विरासत के बिना प्रत्येक प्रतिनिधि को अलग से करने की कोशिश की है और यह ठीक काम करता है इसलिए मुझे विश्वास है कि समस्या कोड के किसी अन्य हिस्से में नहीं है।
कोई भी जानता है क्यों? मुझे प्रोटोकॉल का उत्तराधिकारी बनाकर लगा, मुझे ड्रैगगेबल टूलबार ऑब्जेक्ट के लिए टूलबार व्यूडिलेगेट भी सेट नहीं करना पड़ेगा।
अद्यतन: जोड़ा गया एक बहुत अधिक कोड
उस महान पोस्ट की सराहना करें। सोचो कि मैं सिर्फ प्रतिनिधियों को अलग रखने के लिए चिपक सकता हूं, न कि नामकरण की बात का एक बड़ा प्रशंसक। आप सामान्य रूप से क्या करेंगे या सिफारिश करेंगे? –
खुशी है कि मैं मदद कर सकता हूं। मुझे प्रतिनिधि संपत्ति को ओवरराइड करने में कुछ भी गलत नहीं दिख रहा है; यह कोड क्लीनर के दोनों तरफ बनाता है। –