2014-10-06 7 views
0

에서 선택하여 카테고리 메서드를 호출 할 수 없습니다 문제는 범주의 메서드가 호출되지 않으며 문제를 찾을 수 없다는 것입니다. 어떤 도움이 필요합니까?내가하는 방법이 메인 클래스

+1

범주를 사용하여 Objective-C의 메서드를 재정의하지 마십시오. 그것은 정의되지 않은 행동이며 아마도 희망대로 작동하지 않을 것입니다. – rmaddy

답변

2

하나의 문제는이 방법을 재정의하지 않는다는 것입니다. 선택기가 동일합니다 (나는 믿습니다) - @selector (showModalFromController :),하지만 방법은 아닙니다. 하나는 리턴 유형이 다르며 또 하나는 클래스 메소드 ('+'로 시작)이고 한 번은 인스턴스 메소드 ('-'로 시작)입니다.

당신은 교체 방법은 서명이 있는지 확인해야합니다

+ (id) showModalFromController: (UIViewController*) controller 

오히려

- (void) showModalFromController: (UIViewController*) controller 

보다 당신이 이것을 정리하면, 당신은 한 걸음 더 가까이있어.

위에서 rmaddy가 주석을 달았으므로, 카테고리를 사용하여 메소드를 무시하고 싶지는 않을 것입니다.

동작을 바꾸려면 해당 서브 클래 싱을 고려하고 필요한 곳에서 새 서브 클래스를 사용하십시오.

무언가 쓸데없는 일을하려는 경우 - 애플리케이션 전체에서이 방법을 바꾸는 것이 좋습니다.이 방법을 매우 신중하게 고려해야합니다.

0

당신은 어떤 카테고리인지 오해했습니다. 카테고리는 하위 클래스가 아닙니다. "main class"에 대한 참조가 잘못되었습니다. 범주는 가독성을 위해 소스 코드를 분해하거나 이미 돌로 설정된 클래스를 확장하는 기능을 제공합니다.

즉, 모든 카테고리에서 모든 소스를 가져 와서 동일한 @implementation 블록 (그룹 일관성을 위해 #pragma mark -으로 구분 될 수 있음)에 넣으면 논리적으로 정확해야합니다.

@implementation SomeClass 
+ (id) showModalFromController: (UIViewController*) controller 
{ 
    AxEmpAuthorizationController * autorizationController = [[self.class alloc] initWithNibName:NSStringFromClass(self.class) bundle:nil]; 
    [autorizationController performSelectorOnMainThread: @selector(showModalFromController:) withObject: controller waitUntilDone: YES]; 
    return [autorizationController authorelease]; 
} 
@end 

@implementation SomeClass (MyCategory) 
- (void) showModalFromController: (UIViewController*) controller 
{ 
    NavigationTopViewController* navigationController = [[NavigationTopViewController allocWithZone: NULL] initWithRootViewController: self]; 
    [controller presentModalViewController: navigationController animated: ![self.class isMain]]; 
    [navigationController release]; 
} 
@end 

이로 : 당신이 작성한 코드에서 변환

@implementation SomeClass 
+ (id) showModalFromController: (UIViewController*) controller 
{ 
    AxEmpAuthorizationController * autorizationController = [[self.class alloc] initWithNibName:NSStringFromClass(self.class) bundle:nil]; 
    [autorizationController performSelectorOnMainThread: @selector(showModalFromController:) withObject: controller waitUntilDone: YES]; 
    return [autorizationController authorelease]; 
} 

#pragma mark - MyCategory 
- (void) showModalFromController: (UIViewController*) controller 
{ 
    NavigationTopViewController* navigationController = [[NavigationTopViewController allocWithZone: NULL] initWithRootViewController: self]; 
    [controller presentModalViewController: navigationController animated: ![self.class isMain]]; 
    [navigationController release]; 
} 
@end 

당신은 같은 클래스에 같은 이름을 가진 두 개의 선택기를 정의하여 선택 이름을 오용하고 있습니다. 정적 메서드를 재정의하려면 하위 클래스를 사용해야합니다. 같은 클래스에 다른 메소드를 원하면 다른 선택기 이름을 사용하십시오.