努力实现代表传承(Trying to Implement Delegate Inheritance)

2019-09-17 13:13发布

我有一个名为ToolbarView类是UIView的子类,基本建立具有消失/顶部重现UIToolbar一个UIView。 我也有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对象。

更新:增加了更多的代码

Answer 1:

在代码中,任何给定的DraggableToolbarView实例有两个属性连接到代表,一个叫toolbarViewDelegate它从它的超类继承,和一个叫draggableToolbarViewDelegate这是在定义DraggableToolbarView本身。 你要设置这两个,如果你想控制器获得所有代表的消息。

你现在要做的是可能的,但是。 您需要同时在您的视图类使用相同的属性名,这样,只有一个对任何情况下的委托连接。

首先,更改超委托的名称。 (请注意,你不需要,确实不应该打扰,申报伊娃的属性-它是由创建@synthesize )。

@interface ToolbarView : UIView <UIGestureRecognizerDelegate>
@property (nonatomic, assign) id <ToolbarViewDelegate> delegate;
@end

您将在子类中使用相同的属性名称。

@interface DraggableToolbarView : ToolbarView
@property (nonatomic, assign) id <DraggableToolbarViewDelegate> delegate;
@end

这是允许的,只要子类中的后盾伊娃的名字比超类的不同的,例如,

// In superclass
@synthesize delegate;
// In subclass
@synthesize delegate = delegate_;

现在改变在两个视图类的所有代表的信息使用此一个属性:

- (void)showBars 
{

    if (self.delegate)
    {
        [self.delegate ...

- (void)drag:(UIPanGestureRecognizer *)sender
{
    //...
    if (self.delegate)
    {
        [self.delegate ...

现在,您可以发送setDelegate:DraggableToolbarView ,它会使用相同的委托拖动方法和显示/隐藏方法。

最后,术语/注释。 在回答你刚才的问题 ,迦勒用于“堆叠”的协议,正确的说法,和理查德没有。 协议不相互继承 ,而是一个协议可以采用其他的。 的关系是类似的,但不同的。 当一个对象符合协议,它有望实现在该协议中声明的方法。 没有实施自带的协议一起。 这同样是一个协议,采用其它的真 - 这些方法都只是宣布双方存在。 当你写:

@protocol DraggableToolbarViewDelegate <ToolbarViewDelegate>

你说,这将实现任何物体DraggableToolbarViewDelegate的方法也将实现从方法ToolbarViewDelegate 。 这一切都让这个意思。 同样,没有实现附带了承诺一起。

在这种情况下,这意味着一个DraggableToolbarView可以预期其委托实施的方法ToolbarViewDelegate



Answer 2:

你没有给整个代码,但无论从任何就出在这里,请确认

  1. 你ToolBarView及其子类有一个id <ToolBarViewDelegate>委托作为一个属性。
  2. 你DraggableToolbarViewDelegate延长NSObject的协议。
  3. 和你的其他的ViewController对象都符合委托协议,而不是toolbarview。
  4. 一旦你的控制器,可实现的委托方法和符合协议,设置视图的对象自我的委托,然后使用委托财产视图设置为来电这些协议的方法。


文章来源: Trying to Implement Delegate Inheritance