2014-07-17 70 views
3

我創建了一個簡單的代碼,它允許我在UISwitcher旁邊實例化一個UILabel。 切換器正在創建,我創建了一個「UIRadio」類,以便在開始時正確實例化標籤。嘗試在實例化UISwitcher時實例化UILabel

繼承人的.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,但它不會在視圖上顯示。 任何線索?

感謝

回答

1

你只是創建無線電但是當你開始,你就不會有上海華盈,因爲你沒有把它添加到任何視圖。所以你可以這樣做下面

當你通過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; 
} 
+0

我真的想到了!但似乎錯了。 – markus

+0

哦!成功了!謝謝<3 – markus

+0

歡迎您! –

2

我敢打賭self.superview是零,當你在initWithLabel方法調用addSubview

我想你會很難用這種方式添加標籤。問題是,當你實例化UIRadio並用initWithLabel:Label:初始化(順便說一句,這是一個非常奇怪的簽名,你的意思是initWithFrame:label:?),UIRadio的實例還沒有超級視圖。如您所說,您可以創建標籤,但沒有超級視圖(尚未),因此嘗試將該標籤添加到視圖層次結構失敗。

我建議你創建的UIView一個單獨的子類,將包含既是UISwitch和標籤。然後你可以實例化這個類,它的init方法可以創建一個switch和一個標籤,並將這些控件作爲子視圖添加到自己。你可以嘗試這樣的事:

@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 
+0

嗯,我已經盡力了NSLog的類名「self.superview」正在調用,它只是不輸出任何內容。如果它真的沒有,我如何獲得父視圖? – markus