2010-04-19 83 views
0

我正在制作一些标签,我想为他们设置自己的代理,但是当我尝试向代理发送操作时,什么都不会发生。如何为UIView子类创建自定义委托协议?

我也试过下面这个教程: link text

但它不为我工作:(

这里是我的代码: TiMTabBar.h

@protocol TiMTabBarDelegate; 

@interface TiMTabBar : UIView { 
    id<TiMTabBarDelegate> __delegate; 

    ... 

    int selectedItem; 

    ... 
} 
//- (id)init; 
- (id)initWithDelegate:(id)aDelegate; 

- (void)setSelectedIndex:(int)item; 
.. 

@property (nonatomic) int selectedItem; 
@property(assign) id <TiMTabBarDelegate> __delegate; 
.. 


... 

@end 

@protocol TiMTabBarDelegate<NSObject> 
//@optional 

- (void)tabBar:(TiMTabBar *)_tabBar didSelectIndex:(int)index; 

@end 

TiMTabBar.m :

#import "TiMTabBar.h" 

... 

@interface NSObject (TiMTabBarDelegate) 
- (void)tabBar:(TiMTabBar *)_tabBar didSelectIndex:(int)index; 
@end 

@implementation TiMTabBar 

@synthesize selectedItem; 
@synthesize __delegate; 
... 

/* 
- (id)init 
{ 
    ... 

    return self; 
} 
*/ 

- (id)initWithDelegate:(id)aDelegate; 
{ 
    //[super init]; 
    __delegate = aDelegate; 
    return self; 
} 

- (void)awakeFromNib 
{ 
    //[self init]; 
    //[self initWithDelegate:self]; 
    ... 
} 

- (void)setSelectedIndex:(int)item { 
    selectedItem = item; 
    if (self.__delegate != NULL && [self.__delegate respondsToSelector:@selector(tabBar:didSelectIndex:)]) { 
     [__delegate tabBar:self didSelectIndex:selectedItem]; 
    } 

    ... 
    if (item == 0) { 
     ... 
    } else if (item == 1) { 
     ... 
    } else if (item == 2) { 
     ... 
    } else if (item == 3) { 
     ... 
    } else if (item == 4) { 
     ... 
    } else { 
     ... 
    } 
} 

/* 
- (void)tabBar:(TiMTabBar *)_tabBar didSelectIndex:(int)index; 
{ 
    //[delegate tabBar:self didSelectIndex:index]; 
    //if (self.delegate != NULL && [self.delegate respondsToSelector:@selector(tabBar:didSelectIndex:)]) { 
     //[delegate tabBar:self didSelectIndex:selectedItem]; 
    //} 
    NSLog(@"tabBarDelegate: %d",index); 
} 
*/ 


@end 

The del博意门只能内部本身,而不是在任何其它文件的作用类似于:

@interface XXXController : UIViewController <TiMTabBarDelegate> { 
    ... 

    ... 

    IBOutlet TiMTabBar *tabBar; 
    ... 
} 
... 

@end 

XXXController.m:

#import "XXXController.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation XXXController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self becomeFirstResponder]; 
    ... 
    tabBar = [[TiMTabBar alloc] initWithDelegate:self]; 
    //tabBar.__delegate = self; 
    ... 
} 

#pragma mark TiMTabBar Stuff 

- (void)tabBar:(TiMTabBar *)_tabBar didSelectIndex:(int)index; 
{ 
    NSLog(@"Controller/tabBarDelegate: %d",index); 
} 

@end 

无的,这似乎在XXXController工作。任何人都知道如何使这项工作?

回答

1

在你的XXXController viewDidLoad你alloc和初始化一个新的TiMTabBar你是否将它添加到控制器的视图?如果没有,那么你点击的视图中的标签栏可能是从没有委托设置的笔尖加载的。

+0

我试了两次。我有一个使用它在一个NIB和一个代码,但他们都没有工作,他们都有代表组 – timothy5216 2010-04-19 19:03:35

+0

有几件事要检查: *您的setToolTabBar的itemSelect方法被调用,因为你期望? *如果是,是否执行了[__delegate tabBar:self didSelectIndex:selectedItem]行? *您是否验证过委托设置为您认为的对象? (即设置一个断点并使用调试器) – 2010-04-19 19:29:24

1

它看起来像 - 在awakeFromNib中,您将代理设置为自身。所以,无论何时您尝试发送委托消息,实际上都会将它们发送到您的TiMTabBar实例,而不是XXXController。

+0

即使我摆脱它它不会工作 – timothy5216 2010-04-19 18:26:55