Mam klasę o nazwie ToolbarView, która jest podklasą UIView i zasadniczo tworzy UIView, który ma znikanie/ponowne pojawianie się paska UIToolbar na wierzchu. Mam również podklasę ToolbarView o nazwie DraggableToolbarView umożliwia użytkownikowi przeciągnięcie widoku wokół ekranu.Próba implementacji dziedziczenia delegata
Potrzebuję utworzyć delegata dla ToolbarView, aby mógł powiadomić inny obiekt/klasę, gdy pasek narzędzi pojawi się ponownie i zniknie. Muszę również utworzyć delegata dla DraggableToolbarView
, aby móc powiadomić inny obiekt/klasę, gdy widok jest przeciągany. Delegat DraggableToolbarViews będzie również musiał powiadomić inny obiekt/klasę, gdy pasek narzędzi pojawi się ponownie i zniknie.
Więc postanowiłem realizować ToolbarViewDelegate, i DraggableToolbarViewDelegate dziedziczą z niego i ma swoją własną metodę jak następuje:
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];
...
Kiedy to zrobić tylko metody DraggableToolbarDelegate
reagują. Jednak gdy robię też [drabbleToolbarView setToolbarViewDelegate:self]
, to działa. Próbowałem robić każdego delegata osobno bez dziedziczenia i działa dobrze, więc uważam, że problem nie występuje w żadnej innej części kodu.
Ktoś może wiedzieć dlaczego? Pomyślałem, że poprzez dziedziczenie protokołów, nie musiałbym ustawiać ToolbarViewDelegate dla obiektu DraggableToolbar.
UPDATE: Dodano dużo więcej kodu
Doceń ten świetny post. Sądzę, że mogę trzymać się osobno, nie będąc wielkim fanem nazwy. Co zwykle robisz lub polecasz? –
Cieszę się, że mogę pomóc. Nie widzę niczego złego w przesłonięciu własności delegata; sprawia, że obie strony kodu są czystsze. –