在实例化UISwitcher时尝试实例化UILabel

时间:2014-07-17 06:59:41

标签: ios xcode uilabel uiswitch

我正在创建一个简单的代码,允许我在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正在正确创建,但它没有在视图上显示。 有线索吗?

由于

2 个答案:

答案 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;
}