2011-08-08 4 views
1

모든 UIViewController에 메서드를 연결해야합니다. 메서드는 단지 내 주요 애플 리케이션 클래스 개체에 대한 포인터를 반환합니다. 그러나 xcode 4는 출력 매개 변수 유형 MyAppDelegate의 선언에서 헤더 파일에 "구문 분석 문제 유형이 예상됩니다"라는 오류를 발생시킵니다. 다른 유형 (예 : id)으로 변경하면 오류가 사라집니다. 하지만 주요 응용 프로그램 대리인 속성에 액세스 할 수있는 도트 구문을 사용하고 xcode4 형식을 id로 변경하면 xcode4가 주 응용 프로그램 대리인 속성을 인식하지 못합니다. 이 메서드에 액세스 할 UIViewController 클래스 파일에 범주 정의 파일을 포함했습니다. 여기체인 방식에 액세스 할 때 범주에서 도트 구문을 사용할 수 있습니까?

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "MyAppDelegate.h" 

@interface UIViewController (MyCategory) 

-(MyAppDelegate *) appDelegate; // xcode 4 complains about MyAppDelegate type, though it autocompletes it and show even in green color. 

@end 

구현됩니다 :

#import "MyCategory.h" 

@implementation UIViewController (MyCategory) 

-(MyAppDelegate *)appDelegate{ 
    MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    return delegate; 
} 

편집 : 여기 내 카테고리의 정의는 내가이 범주를 구현하고있어 이유는 내가 내 주요 응용 프로그램에 액세스하기위한 편리한 바로 가기를 가질 필요가있다

// handy shortcut :) 
self.appDelegate.someMethod; 

//not so handy shortcut :(
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
+1

MyAppDelegate는 어떻게 선언됩니까? –

+0

@interface MyAppDelegate : NSObject . 그것은 단지 UIApplicationDelegate 프로토콜을 구현 한 것입니다. – Centurion

+0

그런 다음'id delegate = ...'을 대신 사용해보십시오. –

답변

1

헤더 파일에 의존성주기가 있다고 생각합니다. MyAppDelegate.h이 직접 또는 간접적으로 MyCategory.h을 가져 오는 경우 범주 선언이 처음 컴파일 될 때 컴파일러는 MyAppDelegate이 무엇인지 알 수 없습니다. 당신은 MyCategory.h 헤더에서 MyAppDelegate.h의 수입을 제거하고 앞으로 클래스 선언으로 교체해야합니다

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@class MyAppDelegate 

@interface UIViewController (MyCategory) 

-(MyAppDelegate *) appDelegate; 

@end 

은 그런 대신 .m 파일 가져 오기를 넣어. 이것은 실제로 좋은 일반 원칙입니다. 가능한 경우 헤더에서 전달 클래스 선언을 사용하고 구현 파일에 가져 오기를 넣습니다.

+0

답변 해 주셔서 감사합니다. – Centurion

1
-(id)appDelegate{ 
    return [[UIApplication sharedApplication] delegate]; 
} 

//Calling code 
MyAppDelegate* delegate = (MyAppDelegate*)[self appDelegate]; 
+0

+1 깨끗한 디자인. 당신이 높은 수준의 프레임 워크 클래스에 그러한 지역화 된 메소드 서명을 포함시키는 것이 나쁜 생각 인 이유를 지적했다면 더 좋을 것입니다. – Perception

+0

긴 코드 행 대신 편리한 바로 가기를 갖고 싶기 때문에 카테고리에 넣을 것입니다. 나가 가지고있는 것을 시도하고있는 편법은 재산 같이 행동 할 것입니다, 그러나 다만 방법 일 것입니다. 필자의 경우, self.appDelegate.someProperty와 같은 주요 애플 리케이션 델리게이트에 액세스하고 싶습니다. – Centurion

+0

@Perception : 타입 캐스트를 넣어야하는 것이 깨끗한 디자인은 어떨까요? – JeremyP

0

추가 : (UIViewControler 객체에서 내 경우) 코드의 어떤 장소에서 위임을 클래스 헤더의 맨 위에 붙여서이 클래스가 존재 함을 컴파일러에 알리거나 #import의 헤더를 알립니다.

일반적으로 동일한 작업을 수행하는 MyAppDelegate의 클래스 메소드를 사용하는 것이 좋습니다. 개념적으로 appDelegate은 메서드가 의미하는 개별보기 컨트롤러의 속성이 아닙니다.

+0

저는 아키텍처를 개선하려고합니다. 내 애플 리케이션은 6 UIViewController 스크린을 가지고 있으며, 모든 MVC는 화면에 다른 MVC를 터뜨리거나 푸싱을 수행합니다. 각 UIViewController 모든 MVC에 대한 포인터가 있어야합니다. 하지만 포인터 솔루션을 좋아하지 않았습니다. 또한 알림 사용에 대한 생각이 싫었습니다. 그런 다음 주 응용 프로그램 대리인 클래스의 내 화면에 필요한 모든 포인터를 갖고 sharedApplication을 사용하여 액세스 할 수있는 조언을 얻었습니다. 하지만 액세스 코드는 꽤 길어서 self.appDelegate.someMyUIViewController와 같은 지름길을 갖고 싶습니다. 그러나 카테고리로 작업 할 수 없었습니다. – Centurion

관련 문제