Попытка реализовать делегированное наследование

У меня есть класс 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];
        }

       ...
}

ToolbarViewDelegate.h

@class ToolbarView;

@protocol ToolbarViewDelegate

@required

- (void) toolBarViewWillShowToolbar:(ToolbarView *)toolbarView;
- (void) toolBarViewWillHideToolbar:(ToolbarView *)toolbarView;

@end

DraggableToolbarView.h

#импортировать "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.

ОБНОВЛЕНИЕ :Добавлено намного больше кода

5
задан Ser Pounce 27 May 2012 в 07:27
поделиться