【问题标题】:How do I make a custom delegate protocol for a UIView subclass?如何为 UIView 子类制作自定义委托协议?
【发布时间】:2010-04-19 18:07:03
【问题描述】:

我正在制作一些选项卡,我想为它们设置自己的委托,但是当我尝试向委托发送操作时,没有任何反应。

我也尝试过遵循本教程: 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

委托只能在自身内部工作,而不是在任何其他文件中,例如:

@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。有谁知道如何进行这项工作?

【问题讨论】:

    标签: iphone uiview delegates protocols nsobject


    【解决方案1】:

    在您分配并初始化一个新的TiMTabBar 之后,在您的 XXXController viewDidLoad 中,您是否将其添加到控制器的视图中?如果不是,则您单击的视图中的选项卡栏可能是从没有设置委托的 nib 加载的选项卡栏。

    【讨论】:

    • 我已经试过两次了。我有一个在 NIB 中使用它,一个在代码中使用它,但它们都不起作用,而且它们都设置了委托
    • 需要检查的几件事: * 您的 TimTabBar 的 setSelectedIndex:item 方法是否按预期调用? * 如果是,是否正在执行 [__delegate tabBar:self didSelectIndex:selectedItem] 行? * 您是否验证了委托设置为您认为的对象? (即设置断点并使用调试器)
    【解决方案2】:

    看起来 - 在 awakeFromNib 中,您将委托设置为自身。因此,每当您尝试发送委托消息时,您实际上是在将它们发送到您的 TiMTabBar 实例,而不是 XXXController。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      相关资源
      最近更新 更多