2013-12-10 2 views
0

내 기본 뷰에 내 사용자 정의 UIView를 추가하고 싶습니다. 설명 : 같은 :하위 뷰 클래스의 기능을 가진 기본 뷰에 하위 뷰 추가

나는 함수 initWithTitle 사용할

AchievementView *achievement = [[AchievementView alloc] initWithTitle:@"Test" description:@"The Descr"]]; 

을하지만이 작동하지 않습니다. initWithTitle : description : 함수는 클래스 메소드로 구현되어야한다.

AchievementView.h

@interface AchievementView : UIView 

@property (strong) NSString *achievementTtl; 
@property (strong) NSString *achievementDescr; 

@property (strong) UIView *theAchievementView; 

- (void)initWithTitle:(NSString*)achievementTitle description:(NSString*)achievementDescription; 
- (void)showAchievement; 

@end 

AchievementView.m

-(void)initWithTitle:(NSString*)achievementTitle description:(NSString*)achievementDescription { 

    self.achievementTtl = achievementTitle; 
    self.achievementDescr = achievementDescription; 


} 
- (void)showAchievement { 

    // Create view popup 
    self.theAchievementView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 423)]; 

    self.theAchievementView.layer.cornerRadius = 8; 
    self.theAchievementView.layer.masksToBounds = YES; 
    self.theAchievementView.layer.shadowRadius = 5; 
    self.theAchievementView.layer.shadowOpacity = .15; 
    [self.theAchievementView setBackgroundColor:[UIColor whiteColor]]; 


    [self addSubview:self.theAchievementView]; 


} 

전화 기본보기의 방법

- (IBAction)share:(id)sender { 
     AchievementView *achievement = [[AchievementView alloc] init]; 
     achievement.achievementTtl = @"Test"; 
     achievement.achievementDescr = @"TestDEscr"; 
    [achievement showAchievement]; 
} 

내가 함께 기본보기에 하위 뷰를 추가 할 수 없습니다 이 함수. "자기"가 잘못되었다고 생각합니다. 무엇이 있어야합니까?

[self addSubview:self.theAchievementView]; 
+1

홈페이지 볼 수 있습니다. 그것은'AchievementView * 업적 = [[AchievementView alloc] initWithTitle ... '이어야합니다. –

+0

oops. 내가 설명하기 위해서만 썼다, 내가 뭘하고 싶은지,) – Florian

+0

나는 너가하려고하는 것에 약간 혼란스러워. 이 코드는 모두 일러스트레이션 용입니까, 아니면 실제 코드입니까? 실제 코드라면 이니셜 라이저는 클래스 메서드 여야하며 특정 규칙 (예 : + (id) init ... { self = [super init]; if (self) {/ * 물건 초기화 * /} 자기 복귀; } 그렇게하지 않으면 self는 항상 null이됩니다. – Travis

답변

1

보기를 초기화하는 방법과 화면에 추가하는 방법과 같은 두 가지 질문이 있습니다.

[[AchievementView alloc] initWithTitle:@"Test" description:@"The Descr"]]; 

당신은 당신이 당신의 addSubview 호출에 잘못된 self을 가지고 올바른 :

당신은 당신은 단지 클래스의 인스턴스가 아닌 클래스 자체에 그것을 사용할 필요는 initWithTitle:description: 방법을 사용할 수 있습니다. 상위 뷰에 대한 참조가 필요합니다. AchievementView 클래스로 전달할 수 있지만 클래스 외부에서 관리하는 것이 더 깔끔합니다.

AchievementViewUIView의 서브 클래스이지만 다른 UIView을 내부에 생성하고있는 것으로 나타났습니다. AchievementView을 직접 사용하는 것이 더 간단 할 것입니다. 귀하의 코드는 다음과 비슷해야합니다

AchievementView.h

@interface AchievementView : UIView 

@property (strong) NSString *achievementTtl; 
@property (strong) NSString *achievementDescr; 

- (id)initWithTitle:(NSString*)achievementTitle description:(NSString*)achievementDescription; 

@end 

AchievementView.m

- (id)initWithTitle:(NSString*)achievementTitle description:(NSString*)achievementDescription { 
    if (self = [super initWithFrame:CGRectMake(0, 0, 300, 423)]) { 
     self.achievementTtl = achievementTitle; 
     self.achievementDescr = achievementDescription; 

     self.layer.cornerRadius = 8; 
     self.layer.masksToBounds = YES; 
     self.layer.shadowRadius = 5; 
     self.layer.shadowOpacity = .15; 
     self.backgroundColor = [UIColor whiteColor]; 
    } 
    return self; 
} 

당신은 당신의 코드에서`alloc` 누락

- (IBAction)share:(id)sender { 
    AchievementView *achievement = [[AchievementView alloc] initWithTitle:@"Test" description:@"TestDEscr"]; 
    [self.view addSubview:achievement]; 
} 
+0

그레이트 대답! 고맙습니다! – Florian

1

숫자 1, 귀하는 기본보기의 하위보기로 결코 achievement을 추가하지 않습니다. 기본적으로 화면 밖에서보기를 작성하고보기에보기를 추가 한 다음 첫 번째보기를 화면으로 이동하지 않고 원하는대로 이동합니다.

최소한이 작업을 수행해야합니다

- (IBAction)share:(id)sender { 
     AchievementView *achievement = [[AchievementView alloc] init]; 
     achievement.achievementTtl = @"Test"; 
     achievement.achievementDescr = @"TestDEscr"; 
    [achievement showAchievement]; 
    [self addSubview:achievement]; 
} 

을 현재 설정되어 있지 (및 계층에 기본 마스크로 가장 전망 이후가 마스크됩니다 경계 않습니다 achievement의 프레임 크기 설정과 함께 (0 , 0,0,0)).

그런 다음 견해와 하위 뷰를 어떻게 다루는 지 다시 생각해 보겠습니다. 제대로 처리하면 initwithtitle이 정상적으로 작동합니다.