2009-11-01 5 views
19

이 질문에 대한 답을 찾았지만 아직 적절한 것을 찾지 못했습니다. 나는 너희들 (그리고 친구들)이 나를 도울 수 있기를 바라고있다. (iPhone 용)다른 클래스에서 접근하는 방법 Objective-C

좋아, 뮤 슬리뷰 응용 프로그램이 있습니다. 각보기에는 고유 한 클래스가 있으며 모든 것이 행복합니다. 그러나, 때로는 다른 클래스가 동일한 메소드를 호출합니다. 지금까지 두 클래스 파일 모두에서 Method를 두 번 작성했습니다.

이 내가 생각하고 싶은 것입니다 :

나는 그것은 자신의 파일에, 새로운 클래스를 만들고 싶어, 모든 "일반적인"방법이 있는지 확인합니다. 그런 다음 다른 클래스가 메서드를 호출해야 할 때마다 다른 파일에서 호출합니다. 이 방법은, 내가 방법을 변경하고 싶을 때, 나는 단지 한 곳에서 그것을 바꿀 필요가있다. 그리고 모든 장소가 아니라. ...

나는 이것을 어떻게 할 것인지 잘 모르겠다. 도움을 청하는 군. 나는 약간 녹슬고 Objective-C에 대해 새롭기 때문에 꽤 많은 예제가 도움이 될 것입니다. 내가 너에게 줄 것을 허락 해줘.

파일 : ViewController1.m

@implementation ViewController1 

//Do Some awesome stuff.... 

CALL "CommonMethod" HERE 

@end 

파일 : ViewController2.m

@implementation ViewController2 

//Do Some awesome stuff.... 

CALL "CommonMethod" HERE 

@end 

파일 : CommonClass

@implementation commonClass 

- (void)CommonMethod:(id)sender 
{ 

//So some awesome generic stuff... 



    } 
@end 
내가 다른 파일을 # import를 할 필요 같은 느낌

, 클래스에서 Object를 만들고 Object에서 Method를 호출 ... 어떻게하면됩니까?

다시 한번 감사드립니다!

답변

26

옵션 1 :

@implementation commonClass 
+ (void)CommonMethod:(id)sender /* note the + sign */ 
{ 
//So some awesome generic stuff... 
    } 
@end 

@implementation ViewController2 

- (void)do_something... { 
    [commonClass CommonMethod]; 
} 


@end 

옵션 2 :

@implementation commonClass 
- (void)CommonMethod:(id)sender 
{ 
//So some awesome generic stuff... 
    } 
@end 

@implementation ViewController2 

- (void)do_something... { 
    commonClass *c=[[commonClass alloc] init]; 
    [c CommonMethod]; 
    [c release]; 
} 

@end 

옵션 3 : 사용 상속 (이 스레드 씨 Totland의 설명 참조)

@implementation commonClass 
- (void)CommonMethod:(id)sender 
{ 
//So some awesome generic stuff... 
    } 
@end 

/* in your .h file */ 
@interface ViewController2: commonClass 

@end 

자연스럽게 당신은 항상 필요 보기 컨트롤러에서 #import commonClass.h으로 변경하십시오.

+0

안녕하세요, 여기 commonClass의 수퍼 클래스는 무엇입니까? 많은 다른 클래스에서 호출해야하는 한 가지 방법이 있으므로 어떤 것이 가장 좋은 방법일까요? –

+0

ARC 모드에서'[속성 해제] '가 허용됩니까? 컴파일러가 허용되지 않는다고 알려줍니다. – tymac

+0

@tymac이 게시물은 2009 년 ARC 이전의 게시물입니다. –

3

공통 코드가 클래스에있을 필요가없는 것처럼 들리네. 당신이하고 싶은 일에 C 스타일의 함수를 사용할 수없는 이유가 있습니까?

공통 코드를 클래스에 넣은 다음 다른 두 클래스를 해당 클래스의 하위 클래스로 만들 수 있습니다. 이 방법은 코드 중복을 방지합니다.

또 다른 옵션은이 공통 코드에 대한 인스턴스 메소드 대신 클래스 메소드를 작성하는 것입니다. 대부분의 사람들은 싱글 톤이 디자인 선택으로 가장 잘 피할 수 있다고 생각합니다.

우리가 실제로 무엇을 성취하려고하는지 더 잘 안다면 좋은 대답을하는 것이 더 쉬울 것입니다.

UIViewController : MyAwesomeViewController : ViewController1 
              : ViewController2 

commonMethod: 다음 MyAwesomeViewController에있는 것입니다 :

+0

상속을 활용하지 않는 것 같습니다. –

+0

고맙습니다. 나는 Class1에서 메소드 (method1)를 가지고있다. Class1.h에서 선언하고 Class1.m에서 구현했습니다. 나는 Class2 가지고 있고 그것을 선택기가 : @ 선택기 (method1). 이 경우 어떻게해야합니까? –

+1

@ 윌리엄, 그게 무슨 소리 야. @ 스리랑카, 어쩌면 그냥 여기에 의견을 게시하는 대신 질문을해야합니까? –

3

은 무엇 당신이 원하는 것은 두 개의 컨트롤러가 공통의 슈퍼 클래스를 공유 할 수 있도록하는 것입니다. 또한 메서드 이름을 대문자로 시작하지 마십시오. 오브젝티브 C는 C 단지 상위 있다는 사실을

[email protected] MyAwesomeController : UIViewController { 

[email protected] ViewController1 : UIViewController { // and ditto for ViewController2 
[email protected] ViewController1 : MyAwesomeController { 
+0

+1 상속은가는 길입니다. –

1

곰을하고, 지시문 # 주로 헤더 파일에 사용되는 반면, A #을 사용을 중지 아무것도하는 것이 없다 : :)

정교하려면 한 구현의 내용을 다른 구현에 포함시키는 것을 포함합니다. 코드가 실제로 동일하면 쉽게 자신의 파일에 스틱을 넣고 .m 파일에 # 포함시킬 수 있습니다.

그렇다면 동일한 기술이 비슷한 동작을하는 경우 특히이 기술을 범주와 함께 사용하는 것이 좋습니다. 당신이 ALLOC하고 의견을 초기화하기 당신의 commonClass에 대한 참조를

1

패스 ...

CommonClass *cc = [[CommonClass alloc] init]; 

ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc]; 
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc]; 

하지만 고전 C가 충분하다 포함하고.

6

여기에 일반적인 "상위"클래스를 만드는 방법에 대한 답변이 나와 있습니다. 그러나 나는 당신이 훨씬 더 잘할 수 있다고 생각합니다. 대신 UIViewController에 category을 만듭니다. 당신은 UIViewController로 무엇이 진행되고 있는지를 알지 못하기 때문에 View Controller 계층을 만들 가치가 있다고 생각하지 않습니다. 사실 그것은 위험 할 수 있습니다. 나는 "기본"UITableViewController를 생성하고 그 클래스를 상속받은 클래스를 만들려고 할 때 여러 가지 문제에 부딪쳤다. 대신 카테고리를 사용하여 이러한 문제를 피했습니다.

귀하의 1 위 우선 순위가 좋은 이유없이 상속을해서는 안되며 앱 스토어에 앱을 다운로드해야하는 사용자가 있어야합니다.

+0

+1 최종 파라 ... –

0

Java 배경 및 C가 거의없는 iPhone 초보자로서 RootController 및 ViewController의 메소드를 참조하려는 유사한 문제가있었습니다.

: 상기 방법은이면 "해봐요"하나하여 액세스

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

:이 방법에 적절한 장소가 AppDelegate에 클래스 하나가 다른 클래스로 획득하는 인스턴스라고 날 듯

[delegate doSomething]; 

그러나 이것은 너무 분명하거나 필요한 부분이 아닙니다. 당신이

ServerManager *SMObject = [ServerManager getInstance]; 

이 servermanager.h 파일을 가져올 것을 잊지 마십시오 사용 여부를 당신이

@interface ServerManager : NSObject 

+(ServerManager *)getInstance; 

@implementation ServerManager 

+(ServerManager *)getInstance 
{ 
static ServerManager *objServerManager = nil; 

if(objServerManager==NULL){ 
objServerManager=[[self alloc] init]; 
} 
// Return the servermanager object. 
return objServerManager; 
} 

전화를 사용할 수 있습니다

0

또 다른 방법.

관련 문제