zu implementieren Ich habe eine Klasse namens ToolbarView, die eine Unterklasse von UIView ist und im Grunde erstellt eine UIView, die eine UIToolbar verschwindet/wieder auftaucht. Ich habe auch eine Unterklasse von ToolbarView namens DraggableToolbarView ermöglicht es dem Benutzer, die Ansicht auf dem Bildschirm zu ziehen.Versuchen, Delegat Vererbung
Ich muss einen Delegaten für ToolbarView erstellen, so dass es ein anderes Objekt/eine andere Klasse benachrichtigen kann, wenn die Symbolleiste wieder angezeigt wird und verschwindet. Ich muss auch einen Delegaten für DraggableToolbarView
erstellen, damit ich ein anderes Objekt/eine andere Klasse benachrichtigen kann, wenn die Ansicht gezogen wird. DraggableToolbarViews-Delegat muss auch ein anderes Objekt/eine andere Klasse benachrichtigen, wenn die Symbolleiste erneut angezeigt wird und verschwindet.
So entschied ich mich ToolbarViewDelegate zu implementieren und haben DraggableToolbarViewDelegate von ihm erben und haben ihre eigene Methode wie folgt vor:
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];
}
...
}
Toolb 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];
...
Wenn ich dies tun nur die DraggableToolbarDelegate
Methoden reagieren. Aber wenn ich auch [drabbleToolbarView setToolbarViewDelegate:self]
mache, funktioniert es. Ich habe versucht, jeden Delegierten getrennt ohne erben zu tun und es funktioniert gut, so glaube ich, dass das Problem in keinem anderen Teil des Codes ist.
Wer weiß warum? Ich dachte, indem ich die Protokolle erben ließ, würde ich nicht auch das ToolbarViewDelegate für ein DraggableToolbar-Objekt setzen müssen.
UPDATE: Hinzugefügt viel mehr Code
Schätzen Sie diesen tollen Beitrag. Ich denke, ich bleibe einfach bei der Trennung der Delegierten, nicht ein großer Fan der Namensgebung. Was würdest du normalerweise tun oder empfehlen? –
Ich bin froh, dass ich helfen konnte. Ich sehe nichts falsch daran, die delegate-Eigenschaft zu überschreiben; Es macht beide Seiten des Codes sauberer. –