2012-08-02 4 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 :이 로고가있는 네비게이션 바를 생성하고 타이틀 버튼을 클릭되었을 때 titleButton 메소드를 호출

@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]; 
} 

. 여기까지는 모든 것이 잘되고 탐색 바는 훌륭하게 표시됩니다. 내 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의 구현이 또한있다. 그러나 제목보기를 클릭하면 다음과 같은 오류 메시지가 나타납니다.

titleButtonClickedUINavigationController으로 전송되는 이유는 무엇입니까? 내 탐색 컨트롤러에서해야 할 일이 있습니까? 난 그냥 평범한 오래된 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

+0

에 재 할당했습니다. 작동하지 않습니다. – darksky

답변

1

당신은 당신의 delegateUINavigationBardelegate 특성 간의 충돌/모호성을 가지고있다. 대리인의 이름을 변경하여 모호성을 제거하십시오. @idz 말했듯이

+1

분명히이 답변에는 아래쪽 투표가 있었지만 설명 할 설명이 없었습니다. 이 답변에 대해 투표를하지 않았다면, 잠시 시간이 있다면, 왜 그랬는지 말해 주시겠습니까? 더 나은 답변을 작성하는 방법을 이해하려면 어떻게해야할까요? – idz

+0

downvote가 여전히 귀찮다면, 대답했을 때 묻는 사람이 답에 대한 3 가지 의견처럼 여기에 씁니다. 당신의 대답을 이해하지 못해 투표를했을 수도 있습니다. 그 때 내가 그것을 분명히했을 때, 그는 주석을 삭제했습니다. – Mazyod

2

문제는 함께 :

@property (nonatomic, assign) delegete; 

당신은 당신이조차하지 않는 것이 이상하다고 표시되지 않는 경우 :

@synthesize delegete; 

UINavigationBar은 이미 idz가 말한 것처럼 delegate 변수를 정의하기 때문입니다.

변화로 선언 :

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

물론

@synthesize myDelegate; 
+0

나는 실제로'@synthesize delegate'을 가지고있다. 위의 코드에 붙여 넣는 것을 잊어 버렸습니다. 델리게이트라는 이름을 델리게이트에 사용하는 관습이 아닌가? 아니면 상관 없습니까? – darksky

+0

다소 다르지만 돌보기 위해 많은 대의원이있는 경우 각자 적절하게 다른 이름을 지정해야합니다 – Mazyod

+0

알겠습니다 - 감사합니다! – darksky