У меня есть класс под названием ToolbarView, который является подклассом UIView и в основном создает UIView, у которого исчезает/вновь появляется UIToolbar сверху. У меня также есть подкласс ToolbarView под названием DraggableToolbarView, который позволяет пользователю перетаскивать представление по экрану.Попытка реализовать делегирование наследования
Мне нужно создать делегат для ToolbarView, чтобы он мог уведомить другой объект/класс о том, когда панель инструментов снова появляется и исчезает. Мне также нужно создать делегат для 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];
}
...
}
К olbarViewDelegate.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]
, он работает. Я пробовал делать каждый делегат отдельно без наследования, и он отлично работает, поэтому я считаю, что проблема не в какой-либо другой части кода.
Кто-нибудь может знать, почему? Я понял, что наследование протоколов наследует, мне также не нужно будет устанавливать ToolbarViewDelegate для объекта DraggableToolbar.
UPDATE: Добавлено много больше кода
Цените это замечательное сообщение. Думаю, я могу просто придерживаться отдельных делегатов, а не большого поклонника именования. Что вы обычно делаете или рекомендуете делать? –
Рад, что я мог помочь. Я не вижу ничего плохого в переопределении собственности делегата; это делает обе стороны кода чище. –