init UIView带参数

问题描述:

我有UIView类,呈现在控制器中编程创建的视图。init UIView带参数

当创建(初始化)UIView我想从UIViewController传递参数,所以可以初始化UIView的实例变量。我希望它在awakeFromNib被调用之前发生。所以在awakeFromNib我可以使用这些参数。

我想我需要在- (id)initWithCoder:(NSCoder *)aDecoder这样做,但是怎么样?它只接收aDecoder

事情是这样的:

- (id)initWithCoder:(NSCoder *)aDecoder { 

    if(self = [super initWithCoder:aDecoder]) { 
     _instanceParameter = parameterFromController; 
    } 

    return self; 
} 


-(void)awakeFromNib{ 
    if (_instanceParameter) 
     do logic 
} 
+1

如果您是制作“'UIView'”编程(换句话说,通过代码),你会不会在故事板或XIB和“'awakeFromNib'”创建它不会得到调用。 – 2013-04-28 08:43:55

+0

haaaa ... @MichaelDautermann在这里..其他人不需要担心这个问题。 – 2013-04-28 08:53:09

+0

@MichaelDautermann,我有一个xib。并在控制器中我: _myUIView = [[[NSBundle mainBundle] loadNibNamed:@“myUIView”owner:self options:nil] objectAtIndex:0]; – Luda 2013-04-28 09:05:47

我猜你已将“UIView”分类为某种东西,我们称之为“LudaView”。

为您的参数公开一个属性,当您从xib文件加载它时,可以在其中设置参数。换句话说:

_myUIView = (LudaView *) [[[NSBundle mainBundle] loadNibNamed:@"myUIView" owner:self options:nil] objectAtIndex:0]; 
if(_myUIView) 
{ 
    _myUIView.parameters = parametersFromViewController; 
} 

您还可以设置你的“LudaView”,然后当绘图方法被调用的第一次,你可以设置的东西了内BOOL属性或伊娃。例如。

- (void)drawRect:(CGRect)rect 
{ 
    if(everythingSetUp == NO) 
    { 
     // do stuff with your parameters here 
     everythingSetUp = YES; 
    } 
    // you shouldn't need to call [super drawRect: rect] here if 
    // subclassing directly from UIView, according to Apple docs 
} 

从你的问题,在很多事情都有点不清楚。当你创建自定义视图时,你可以调用第二个初始化函数。事情是这样的:

// In the UIViewController 
NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"CustomView" 
               owner:self 
              options:nil]; 
CustomView *myView = [[nibs objectAtIndex:0] initWithParameter:myParameter]; 
[self.view addSubview:myView]; 

然后在您的UIView类:

- (id) initWithParameter:(id)parameter 
{ 
    _instanceParameter = parameter; 
    // Do whatever initialization you need to 
    ... 
    return self; 
} 

只要做所有你需要在initWithParameter方法的初始化。

+0

但是不会loadNibNamed调用awakeFromNib。 底线是:我想初始化实例变量,然后相应地更新UI。我应该使用哪些功能? – Luda 2013-04-28 09:07:33

+0

您可以在自定义的' - (id)initWithParameter:(id)参数'方法中更新用户界面,或者您可以在'viewDidLoad'中执行此操作,并在init函数中调用viewDidLoad。 – 2013-04-28 09:41:01

+1

viewDidLoad是UIVIewController函数 – Luda 2013-04-28 13:18:59