[英]Add Subview to main view with function of subview class
我想将自定义UIView添加到我的主视图中。
我想使用函数initWithTitle:description:like:
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];
第一,您永远不会将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
就可以了。
您有两个问题:如何初始化视图以及如何将其添加到屏幕。
你可以使用initWithTitle:description:
方法,你只需要在类的实例上使用它,而不是类本身:
[[AchievementView alloc] initWithTitle:@"Test" description:@"The Descr"]];
你在addSubview
调用中有错误的self
是对的。 您需要对父视图的引用。 您可以将它传递到AchievementView
类中,但在类外部管理它更清晰。
我还注意到AchievementView
是UIView
的子类,但是你在其中创建了另一个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;
}
主要观点
- (IBAction)share:(id)sender {
AchievementView *achievement = [[AchievementView alloc] initWithTitle:@"Test" description:@"TestDEscr"];
[self.view addSubview:achievement];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.