代表被送到错误的班级

时间:2012-08-02 10:28:11

标签: iphone objective-c ios delegates

我将我的导航栏子类化,使标题视图可以点击。单击时,它将显示另一个视图控制器。我正在导航栏中创建一个协议,它将告诉导航控制器已单击标题视图。以下是我的导航栏的定义方式:

NavigationBar.h:

@protocol NavigationBarDelegate;

@interface NavigationBar : UINavigationBar
{
    id <NavigationBarDelegate> delegate;
    BOOL _titleClicked;
}

@property (nonatomic, assign) id <NavigationBarDelegate> delegate;

@end

@protocol NavigationBarDelegate
@optional
- (void)titleButtonClicked:(BOOL)titleClicked;
@end

委托实现一个可选方法。 .m文件如下:

NavigationBar.m:

@implementation NavigationBar

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _titleClicked = 0;
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    self.tintColor = [UIColor colorWithRed:(111/255.f) green:(158/255.f) blue:(54/255.f) alpha:(255/255.f)];

    UIImage *image = [UIImage imageNamed:@"titlelogo.png"];

    UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, image.size.width, image.size.height)];
    titleButton.backgroundColor = [UIColor colorWithPatternImage:image];
    [titleButton addTarget:self action:@selector(titleButton:) forControlEvents:UIControlEventTouchUpInside];

    //        self.navigationController.delegate = self;
    [self.topItem setTitleView:titleButton];

    [super drawRect:rect];
}

- (void)titleButton:(UIButton *)sender
{
    _titleClicked = !_titleClicked;
    [self.delegate titleButtonClicked:_titleClicked];
}

这会创建一个带徽标的导航栏,并在单击标题按钮时调用titleButton方法。一切都很好,直到这里,导航栏显示良好。

在我的RootViewController

NavigationBar *navigationBar = [[NavigationBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 44.0f)];
navigationBar.delegate = self;
[self.navigationController setValue:navigationBar forKey:@"navigationBar"];

titleButtonClicked的实现也在那里。但是,当我点击标题视图时,我收到以下错误:-[UINavigationController titleButtonClicked:]: unrecognized selector sent to instance

为什么我将titleButtonClicked发送给UINavigationController?我的导航控制器中有什么需要做的吗?我只是使用普通的UINavigationController。我是否也需要继承它?如果是这样,为什么?

修改

po self.delegate的{​​{1}}行呼叫[self.delegate titleViewClicked:_titleClicked];会产生以下结果。代表是如何改变其类型的?我该如何解决这个问题?

NavigationBar.m

2 个答案:

答案 0 :(得分:2)

正如@idz所说,问题在于:

@property (nonatomic, assign) delegete;

难道你没有看到你甚至没有:#/ strike>

这很奇怪
@synthesize delegete;

<击>

那是因为UINavigationBar已经定义了delegate变量,正如idz所说。

将您的声明更改为:

// use unsafe_unretained in ARC, not assign
@property (nonatomic, unsafe_unretained) myDelegete;

当然

@synthesize myDelegate;

答案 1 :(得分:1)

您的delegateUINavigationBar delegate财产之间存在冲突/歧义。重命名您的委托以消除它们的歧义。