2014-10-02 1 views
0

내 하위 클래스의 수퍼 클래스 iBoutlets 객체에 액세스하려고합니다. 가능한가? 나는 다음과 같은 방법으로 노력하고 있지만 항상 늘지 않습니다.iOS가 하위 클래스의 수퍼 클래스 iBoutlets 개체에 액세스 할 수 있습니까?

여기 내 코드입니다 : 내 슈퍼 클래스

#import <UIKit/UIKit.h> 

@interface SuperClassA : UIViewController { 

} 

@property (weak, nonatomic, getter=getDummyView) IBOutlet UIView *dummyView; 

@end 

@implementation SuperClassA 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    SubClassB *obj = [SubClassB new]; 
    [obj printSuperClassiBouletObject]; 
} 

@end 

내 서브 클래스 :

#import <UIKit/UIKit.h> 

@interface SubClassB : SuperClassA { 

} 

@end 

@implementation SubClassB 

-(void)printSuperClassiBouletObject 
{ 
    NSLog(@"view: %@", [self getDummyView]); 
} 
@end 

위의 코드는 항상 나에게 전무 값을 제공합니다. 어떤 아이디어를 실제 iBoutlet 객체를 얻는 방법? 하지만 iBoutlet을 함수 인수로 전달하면 객체가 0이 아닙니다. 슈퍼 클래스에서 구현 파일에서 @synthesize를 사용하여 강력한 속성을 시도했지만 도움이되지 않습니다. 정말 도움이 될만한 도움.

+0

IBOutlet은 클래스 이름이 아니며 인터페이스 작성기의 마커 일 뿐이므로 인터페이스에 중요한 이름을 식별 할 수 있습니다. 코드에는 중요하지 않으며 XIB에만 적용됩니다. –

답변

0

범위 규칙과 관련하여 IBOutlet과 관련하여 특별한 것은 없습니다. 슈퍼 클래스의 선언을 하위 클래스에 포함 시켜서 super의 모든 속성을 상속 할 수 있습니다. 이를 수행하는 간단한 방법은 속성 선언을 수퍼 클래스의 공용 인터페이스 (superclass.h)에 배치하는 것입니다. 서브 클래스가 그것을 가져와야한다는 것을 알기 때문에 거기에있는 모든 것이 서브 클래스에서 사용 가능하다는 것을 알고 있습니다.

하위 클래스에서 속성에 액세스하지만 다른 클래스에서는 액세스하지 않으려면보다 복잡한 배열이 필요합니다. 이러한 "보호 된"선언은 슈퍼 및 서브 클래스 만 가져 오는 세 번째 헤더 파일로 이동해야합니다. 즉

(간단한 경우) :

// MySuper.h 
@interface MySuper : NSObject 
@property (weak,nonatomic) IBOutlet UIView *someOutlet; 
@end 

// MySub.h 
#import "MySuper.h" 

@interface MySub : MySuper 
// stuff for my sub 
@end 

지금 모두 MySuperMySub는 "보호"를 someOutlet

를 참조 할 수 있습니다,이 같은 :

// MySuper.h 
@interface MySuper : NSObject 
// only public stuff here 
@end 

// MySuper-protected.h 
@interface MySuper() 
@property (weak,nonatomic) IBOutlet UIView *someOutlet; 
@end 

// MySuper.m 
#import "MySuper.h" 
#import "MySuper-protected.h" 

// MySub.h 
// same as simple case 

// MySub.m 
#import "MySub.h" 
#import "MySuper-protected.h" 
0

제 생각에 문제는 여기에 있습니다 :

SubClassB *obj = [SubClassB new]; 
[obj printSuperClassiBouletObject]; 

New는 기본 초기화 프로그램을 사용하여 클래스 이름으로 Nib를로드하려고 시도합니다 (SubClassB). 콘센트를 프로젝트에 설정하는 SubClassB.xib가 있습니까? 그렇지 않으면 기본 objc 이니셜 라이저에 의해 SubClassB가 빈 속성으로 초기화됩니다.

이 시도 :

SubClassB *obj = [[SubClassB alloc] initWithNibName:@"SuperClassA"]; //or xib name that SuperClassA uses to initialize 
0

마지막으로, 나는이 방법을 사용하여이를 달성 할 수 있었다 !!!! 내 서브 클래스에서

난에 방법을 변경 :

-(void)printSuperClassiBouletObject:(SuperClassA*)superClassObj 

내 상위 클래스에 내가 이런 식으로 호출 오전 :

SubClassB *obj = [SubClassB new]; 
[obj printSuperClassiBouletObject:self]; 

그리고

내 하위 클래스에서 내가 액세스 슈퍼 클래스의 객체이고 슈퍼 클래스 인스턴스 자체의 변수. 모든 도움 주셔서 감사합니다 !!!!!! :-)

관련 문제