2012-03-19 5 views
1

이 질문은 쉬운 질문입니다.하지만 이해하기가 힘듭니다. prepareForSegue 동안 대리자가 무엇인지 객체에 알릴 수 있도록 객체에 대한 속성을 만들려고합니다. 프로토콜을 사용하여이 작업을 수행 할 수 있음을 알고 있지만이 경우 직접적인 접근 방식이 가장 간단하다고 생각했습니다. 불행하게도, 컴파일러 오류에 다음 코드 결과 : I는 속성 선언을 입력하면델리게이트 속성을 선언 할 때 오류가 발생합니다.

#import <UIKit/UIKit.h> 
#import "PlanningViewController.h" 

@interface DepartmentViewController : UITableViewController 

@property (nonatomic, weak) PlanningViewController *planningDelegate; 

@end 

는, 엑스 코드는 PlanningViewController을 인식하고 심지어 통해 나를 그냥 탭의 텍스트를 표시합니다. 컴파일러는 다음과 같이 불평합니다 :

Unknown type name 'PlanningViewController': did you mean 'UISplitViewController'? 

내가 뭘 잘못하고 있니?

PlanningViewController.h은 다음과 같습니다

#import <UIKit/UIKit.h> 
#import "DepartmentViewController.h" 

@interface PlanningViewController : UITableViewController 


// Table cell connections 
- (IBAction)addItemPressed:(id)sender; 


@end 
+1

'PlanningViewController.h'의 내용을 보여주십시오. – trojanfoe

답변

1

제거하여 PlanningViewController.h 헤더 파일에서이 라인 :

#import "DepartmentViewController.h" 

당신은 당신의 헤더 파일에서 루프의 무언가를 가지고있다.

#import <UIKit/UIKit.h> 

@class PlanningViewController; 

@interface DepartmentViewController : UITableViewController 

@property (nonatomic, weak) PlanningViewController *planningDelegate; 

@end 
+0

그 일을 했어요. 감사! – CodeBuddy

+0

@CodeBuddy 바로 그거야 - 건배! – trojanfoe

0

난 당신이 종류의 대리자 후두둑의 주요 포인트 중 하나를 놓친 것 같아 :

더 나은 아직, (헤더 파일에 PlanningViewController.h을 포함 할 필요가 없다)이 같은 DepartmentViewController.h 보이게 그것은 당신에게 객체들을 분리시키는 것입니다. 이 대리자를 선언하는 가장 좋은 방법은 다음과 같습니다

if ([self.delegate respondsToSelector:@selector(departmentViewController:isProcessingPeople:)]) { 
    [self.delegate departmentViewController:self isProcessingPeople:people]; 
} 

그리고 당신의 계획 뷰 컨트롤러에서

,이 방법을 구현하는 것이 : 부서보기 컨트롤러에서
#import <UIKit/UIKit.h> 

@protocol DepartmentViewControllerDelegate; // forward declaration of protocol 

@interface DepartmentViewController : UITableViewController 

@property (nonatomic, weak) id <DepartmentViewControllerDelegate> delegate; 

@end 

@protocol DepartmentViewControllerDelegate 
- (void)departmentViewController:(DepartmentViewController *)controller 
       isProcessingPeople:(NSArray *)people 
@end 

, 당신은 다음처럼 작성할 수 있습니다 :

- (void)departmentViewController:(DepartmentViewController *)controller 
       isProcessingPeople:(NSArray *)people { 
    // do necessary work here 
} 

여기 예제는 위임자에게 보낼 수있는 하나의 메시지의 예입니다. 필요한 것을 추가 할 수는 있지만 컨트롤러간에 커플 링이 없도록합니다. 계획 뷰 컨트롤러는 부서 컨트롤러에 대해 필요한 모든 것을 알고 있지만 부서 컨트롤러는 계획 컨트롤러에 대해 알 필요가 없습니다.

현재 가지고있는 것을 고수하고 싶다면 실제로 대리자 패턴이 아니라는 것을 인식하고 속성 이름을 변경해야합니다.

+0

의미가 있습니다. 나는 그걸 고수 하겠지만, 당신이 제안한대로, 혼동을 피하기 위해 이름을 바꾼다. – CodeBuddy

관련 문제