使用参数初始化 UIView

Posted

技术标签:

【中文标题】使用参数初始化 UIView【英文标题】:init UIView with parameters 【发布时间】:2013-04-28 08:41:48 【问题描述】:

我有 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

【问题讨论】:

如果您以编程方式(换句话说,通过代码)创建“UIView”,则不会在情节提要或 XIB 中创建它,“awakeFromNib”不会被叫了。 haaaa...@MichaelDautermann 在这里.. 其他人不需要理会这个问题。 @MichaelDautermann,我有一个 xib。在控制器中我这样做: _myUIView = [[[NSBundle mainBundle] loadNibNamed:@"myUIView" owner:self options:nil] objectAtIndex:0]; 【参考方案1】:

我猜你已经将“UIView”子类化了,我们称之为“LudaView”。

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

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

    _myUIView.parameters = parametersFromViewController;

您还可以在“LudaView”中设置 BOOL 属性或 ivar,然后当第一次调用绘图方法时,您可以进行设置。例如

- (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

【讨论】:

【参考方案2】:

从您的问题来看,很多事情都不清楚。创建自定义视图时,可以调用第二个 init 函数。像这样的:

// 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 方法中进行所有需要的初始化即可。

【讨论】:

但不是 loadNibNamed 调用 awakeFromNib。底线是:我想初始化实例变量,然后相应地更新 UI。我应该使用哪些功能? 您可以在自定义的- (id) initWithParameter:(id)parameter 方法中更新UI,也可以在viewDidLoad 中进行更新,然后在init 函数中调用viewDidLoad。 viewDidLoad 是 UIVIewController 函数 啊,对。您可以在-layoutSubviews 中进行 UI 自定义 是的,有几种方法可以做你想做的事。如果你只是设置属性,那效果很好。

以上是关于使用参数初始化 UIView的主要内容,如果未能解决你的问题,请参考以下文章

如何将额外的参数传递给自定义UIView类以便在swift中进行初始化

如何将值从 XIB 传递到 UIView 初始化程序?

使用输入参数初始化 xib

为啥我初始化 uiview 和 uiview 也被 swift 删除?

UIView在swift中使用viewModel回调初始化

初始化自定义类 UIVIew