0

ナビゲーション バーをサブクラス化し、タイトル ビューをクリックできるようにしました。クリックすると、別のView Controllerが表示されます。タイトルビューがクリックされたことをナビゲーションコントローラーに伝えるプロトコルをナビゲーションバーに作成しています。私のナビゲーションバーの定義方法は次のとおりです。

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

デリゲートは、オプションのメソッドを 1 つ実装します。ファイルは次の.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オンライン[self.delegate titleViewClicked:_titleClicked];で呼び出すNavigationBar.mと、以下の結果が得られます。デリゲートはどのようにその型を変更しましたか? どうすれば修正できますか?

(lldb) po self.delegate
(objc_object *) $1 = 0x07550170 <UINavigationController: 0x7550170>
4

2 に答える 2

2

@idzが言ったように、問題はあなたにあります:

@property (nonatomic, assign) delegete;

次のものさえ持っていないのは奇妙だと思いませんか?

@synthesize delegete;

これは、 idz が言ったようUINavigationBarに、既に変数を定義しているためです。delegate

宣言を次のように変更します。

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

そしてもちろん

@synthesize myDelegate;
于 2012-08-02T11:59:48.853 に答える
1

delegateUINavigationBardelegateプロパティの間に衝突/あいまいさがあります。デリゲートの名前を変更して、曖昧さを解消します。

于 2012-08-02T10:38:27.273 に答える