2013-12-10 93 views
0

我想将我的自定义UIView添加到我的主视图。添加子视图到具有子视图类功能的主视图

我想使用的功能initWithTitle:描述:喜欢:

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

但是,这是行不通的。 t 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

你缺少'alloc'在你的代码。它应该是'AchievementView * achievement = [[AchievementView alloc] initWithTitle ...' –

+0

oops。我写它只是为了解释,我想做什么;) – Florian

+0

我对你想要做的事情有点困惑。是所有这些代码的插图,还是真正的代码?因为如果它是真实的代码,你的初始值必须是类方法,并且必须遵循某些约定,即, +(id)init ... {self = [super init]; if(self){/ * initialize stuff * /} return self; } 如果你不这样做,自我将永远为空。 – Travis

回答

1

您有2个问题:如何初始化视图以及如何将其添加到屏幕。

可以使用initWithTitle:description:方法,你只需要使用它的类的实例,而不是类本身:

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

你是正确的,你有你的addSubview调用错误self。您需要对父视图的引用。你可以将它传递给你的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。米

- (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; 
} 

主视图

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

很好的回答!谢谢! – Florian

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将工作得很好。

相关问题