我正在创建一个简单的代码,允许我在UISwitcher之外实例化UILabel。 切换台正在正常创建,我创建了一个" UIRadio" class在开始时正确地实例化标签。
继承人.m:
#import "UIRadio.h"
@implementation UIRadio
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
-(id)initWithLabel:(CGRect)frame Label:(NSString*)labelText
{
self = [super init];
if (self) {
self.frame=frame;
label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 100)];
label.text=labelText;
[self.superview addSubview:label];
}
return self;
}
-(void)removeFromSuperview{
[label removeFromSuperview];
}
@end
这是.h:
#import <UIKit/UIKit.h>
@interface UIRadio : UISwitch{
UILabel *label;
}
- (id)initWithLabel:(CGRect)frame Label:(NSString*)label;
@end
看起来UILabel正在正确创建,但它没有在视图上显示。 有线索吗?
由于
答案 0 :(得分:2)
当您在self.superview
方法中致电addSubview
时,我打赌initWithLabel
为零。
我认为你很难以这种方式添加标签。问题在于,当您实例化UIRadio
并使用initWithLabel:Label:
初始化它(顺便说一下,这是一个非常奇怪的签名,您的意思是initWithFrame:label:
?){{1还没有超级视图。正如您所说,您创建了标签,但是还没有superview(还),因此您尝试将该标签添加到视图层次结构中失败。
我建议您创建一个单独的UIRadio
子类,包含 UIView
和标签。然后,您可以实例化该类,并且其init方法可以创建开关和标签,并将这些控件作为子视图添加到自身。您可以尝试这样的事情:
UISwitch
答案 1 :(得分:1)
您只是在创建广播,但是当您启动时,您将无法拥有超级视图,因为您没有将其添加到任何视图中。所以你可以这样做
通过addSubView:方法将该无线电视图添加到另一个视图后,它将引用superview。
如果你想为开关添加标签,那么你可以像这样添加
[aSwitch addSubview:label];
因为UISwitch也是一个UIView
UIView--->UIControl--->UISwitch--->UIRadio
-(id)initWithLabel:(CGRect)frame Label:(NSString*)labelText andSuperView:(UIView*)aSuperView
{
self = [super init];
if (self) {
self.frame=frame;
label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 100)];
label.text=labelText;
[aSuperView addSubview:label];
}
return self;
}