2013-12-10 135 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將工作得很好。

相關問題