【问题标题】:Trying to instance a UILabel when instancing a UISwitcher在实例化 UISwitcher 时尝试实例化 UILabel
【发布时间】:2014-07-17 06:59:40
【问题描述】:

我正在创建一个简单的代码,它允许我在 UISwitcher 之外实例化一个 UILabel。 切换器正在正常创建,我创建了一个“UIRadio”类以在开始时正确实例化标签。

这是.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 似乎已正确创建,但未显示在视图中。 有什么线索吗?

谢谢

【问题讨论】:

    标签: ios xcode uilabel uiswitch


    【解决方案1】:

    我敢打赌,当您在 initWithLabel 方法中调用 addSubview 时,self.superview 是 nil。

    我认为您将很难以这种方式添加标签。问题是当你实例化UIRadio 并用initWithLabel:Label: 初始化它(顺便说一句,这是一个非常奇怪的签名,你的意思是initWithFrame:label:?)UIRadio 的实例还没有超级视图.正如您所说,您创建了标签,但还没有超级视图,因此您尝试将该标签添加到视图层次结构中失败。

    我建议您创建一个单独的UIView 子类,该子类将包含 UISwitch 和标签。然后您可以实例化该类,它的 init 方法可以创建开关和标签,并将这些控件作为子视图添加到自身。你可以试试这样的:

    @interface LabeledSwitch : UIView
    @end
    
    @implementation LabeledSwitch {
        UISwitch *_switch;
        UILabel *_label;
    }
    
    - (id)initWithFrame:(CGRect)frame labelText:(NSString *)labelText {
        self = [super initWithFrame:frame];
        if (self) {
            _switch = [[UISwitch alloc] initWithFrame:CGRectZero];
            _label = [[UILabel alloc] initWithFrame:CGRectZero];
            _label.text = labelText;
            [self addSubview:_switch];
            [self addSubview:_label];
        }
        return self;
    }
    
    - (void)layoutSubviews {
        // Whatever code you like to set reasonable frames
        // for _switch and _label based on the current bounds
        // of this container view.
    }
    
    @end
    

    【讨论】:

    • 嗯,我试过 NSLog 类的名称“self.superview”正在调用,它只是不输出任何东西。如果它真的为零,我如何获得父视图?
    【解决方案2】:

    您只是在创建收音机,但是当您启动时,您不会拥有超级视图,因为您没有将它添加到任何视图中。所以你可以在下面这样做

    通过 addSubView: 方法将该单选视图添加到另一个视图后,它才会引用超级视图。

    如果你想添加标签来切换,那么你可以这样添加

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

    【讨论】:

    • 哦!工作!谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2016-12-26
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    相关资源
    最近更新 更多