2012-08-02 53 views
0

我將我的導航欄分類,使標題視圖可點擊。點擊後,它會顯示另一個視圖控制器。我正在導航欄中創建一個協議,它會告訴導航控制器標題視圖已被點擊。這裏是我的導航欄是如何定義的:代理髮送錯誤類

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。我是否也需要繼承它?如果是這樣,爲什麼?

編輯:

NavigationBar.m[self.delegate titleViewClicked:_titleClicked];調用po self.delegate得到下面的結果。代表如何改變其類型?我該如何解決這個問題?

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

的嘗試委託財產重命名爲任何其他。似乎[自我。navigationController setValue:navigationBar forKey:@「navigationBar」];將酒吧委託人重新分配給navController – NeverBe 2012-08-02 10:36:36

+0

我做過了 - 不起作用。 – darksky 2012-08-02 10:40:05

回答

1

你有你的delegateUINavigationBardelegate財產之間的衝突/不確定性。重命名您的委託以消除它們的歧義。

+1

顯然這個答案有一些反對票,但沒有評論來解釋他們。如果你對這個答案投下了贊成票,如果你有時間,請告訴我爲什麼?如果你不告訴我這個問題有什麼問題,我該如何理解如何寫出更好的答案? – idz 2012-08-03 08:10:03

+0

如果downvote仍然困擾着你,那麼當你回答時,提問者在這裏寫下3條關於你答案的評論。也許他因爲不理解你的答案而投了票。那是我澄清它的時候,他刪除了評論。 – Mazyod 2012-08-09 04:04:43

2

正如@idz說,問題是你的:

@property (nonatomic, assign) delegete; 

君不見,這很奇怪,你甚至不有:

@synthesize delegete; 

這是因爲UINavigationBar已經定義了一個delegate變量,如idz所說。

改變你的聲明:

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

當然

@synthesize myDelegate; 
+0

我確實有一個'@synthesize delegate'。我忘了將它粘貼到上面的代碼中。爲代表使用「委託」這個名稱不是慣例嗎?或者沒關係? – darksky 2012-08-02 12:01:02

+0

它有點是,但如果你有很多代表需要照顧,你應該命名每一個適當的不同 – Mazyod 2012-08-02 12:02:02

+0

知道了 - 謝謝! – darksky 2012-08-02 12:04:38