2013-05-17 71 views
3

在我的應用程序中,我已經對UIView進行了子類化,並且在.m文件(2UIButton和UITextField)中聲明瞭三個ivars。我通過從對象庫拖動UIView並將它們轉換爲我的子類來使用此對象。下面是我的實現如何在界面構建器(.xib)中顯示子類UIView之前?

@interface Prescriber()<UITextFieldDelegate> 
{ 
    UIButton *_addButton; 
    UIButton *_lessButton; 
    UITextField *_valueField; 

} 
@end 
@implementation Prescriber 
@synthesize value=_value,intValueofStrig=_intValueofStrig; 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    NSLog(@"prescriber called"); 
    return self; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 
-(void)layoutSubviews 
{ 

    if (!_addButton) { 
     _addButton=[[UIButton alloc]init]; 
     [_addButton addTarget:self action:@selector(addbuttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
     [_addButton setBackgroundImage:[UIImage imageNamed:@"add1.png"] forState:UIControlStateNormal]; 
     _addButton.layer.cornerRadius=5; 

    } 
    if (!_lessButton) { 
     _lessButton=[[UIButton alloc]init]; 
     [_lessButton addTarget:self action:@selector(lessButoonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
     [_lessButton setBackgroundImage:[UIImage imageNamed:@"Minus.png"] forState:UIControlStateNormal]; 
    } 
    if (!_valueField) { 
     _valueField=[[UITextField alloc]init]; 
     _valueField.delegate=self; 
    } 
    ///positioning the addbutton on left corner and right corner and position and 
       textfield in the center 


} 

我所做的組態碼 - (空)layoutSubviews方法,我-initwithFrame不會被調用,因爲它們已經在廈門國際銀行文件。 我想知道的是,在-layoutSubViews中進行初始化是否正確,因爲這種方法有機會再次調用。或者我能夠調用 -viewDidLoad像delgate方法爲我的子類視圖呢?

編輯: - 這是可能的創建一個IBOutlet,但這種方式是我的一個約束。

+0

不要在__layoutSubviews__中進行初始化,即使在方向改變時也會多次調用它 –

回答

1

對於IB的情況下,你可以設置你-awakeFromNib查看並初始化其子視圖:

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    // your initialization code here 
} 

使用這種方法,你的情況是完全初始化和IB連接已建立。它也保證只被調用一次(每個實例)。如果您還以編程方式創建此類型的實例,那麼您應該考慮可在-awakeFromNib中調用的共享初始化方法。

在初始化程序中添加子視圖的問題是您的視圖處於部分構建狀態,最終可能會有副作用或難以以明確和確定的方式初始化視圖/對象圖; -awakeFromNib至少可確保所有NIB對象已創建並且存在連接,但未定義調用-awakeFromNib的順序。如果你需要確切的排序,那麼你應該真的以編程的方式處理它。

1

我所做的組態碼 - (空)layoutSubviews方法 我-initwithFrame不會被調用

UIView有指定初始化。當視圖從筆尖加載時,將調用-initWithCoder:而不是-initWithFrame:。您可以將初始化代碼放在該方法中,或者將其放入您從兩個初始化程序調用的通用初始化方法中。

在-layoutSubViews中執行初始化是否正確,因爲 是此方法再次被調用的機會。

也就是說,使用-layoutSubviews進行初始化的問題確實如此:它可能會被多次調用,並不總是在視圖的生命週期的開始。更好地使用初始化方法。

2

做一個私人設置方法:

@interface MyViewClass() 
- (void)_setup; 
@end 

@implementation MyViewClass 

- (void)_setup 
{ 
    _addButton=[[UIButton alloc]init]; 
    [_addButton addTarget:self action:@selector(addbuttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    [_addButton setBackgroundImage:[UIImage imageNamed:@"add1.png"] forState:UIControlStateNormal]; 
    _addButton.layer.cornerRadius=5; 

    _lessButton=[[UIButton alloc]init]; 
    [_lessButton addTarget:self action:@selector(lessButoonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    [_lessButton setBackgroundImage:[UIImage imageNamed:@"Minus.png"] forState:UIControlStateNormal]; 

    _valueField=[[UITextField alloc]init]; 
    _valueField.delegate=self; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self != nil) 
    { 
     [self _setup]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self != nil) 
    { 
     [self _setup]; 
    } 
    return self; 
} 

@end 
相關問題