Tengo una clase llamada ToolbarView que es una subclase de UIView y básicamente crea una UIView que tiene una UIToolbar que desaparece/reaparece en la parte superior. También tengo una subclase de ToolbarView llamada DraggableToolbarView que permite al usuario arrastrar la vista por la pantalla.Intentando Implementar Herencia de Delegados
Necesito crear un delegado para ToolbarView para que pueda notificar a otro objeto/clase de cuando la barra de herramientas vuelve a aparecer y desaparece. También necesito crear un delegado para DraggableToolbarView
para poder notificar a otro objeto/clase cuando se arrastra la vista. El delegado DraggableToolbarViews también deberá notificar a otro objeto/clase cuando la barra de herramientas vuelva a aparecer y desaparezca.
así que decidí poner en práctica ToolbarViewDelegate, y han DraggableToolbarViewDelegate heredar de ella y tener su propio método como el siguiente:
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];
...
Cuando hago esto sólo los métodos DraggableToolbarDelegate
están respondiendo. Sin embargo, cuando también hago [drabbleToolbarView setToolbarViewDelegate:self]
, funciona. He intentado hacer cada delegado por separado sin herencia y funciona bien, así que creo que el problema no está en ninguna otra parte del código.
¿Alguien podría saber por qué? Pensé que al hacer que los protocolos heredasen, no tendría que configurar ToolbarViewDelegate para un objeto DraggableToolbar.
ACTUALIZACIÓN: Se ha añadido un código mucho más
Apreciar esa excelente publicación. Creo que podría limitarme a mantener a los delegados separados, no un gran admirador de los nombres. ¿Qué harías o recomendarías hacer normalmente? –
Me alegro de poder ayudar. No veo nada malo al anular la propiedad delegada; hace que ambos lados del código estén más limpios. –