2012-04-11 74 views
4

我想要为UIView自定义初始值设定项的最佳方式,以便可以将值传递到初始值设定项,并立即将其作为iVar存储在UIView子类中,因为需要此值为drawRect中的绘图。为UIView自定义initWithFrame

目前我使用的是默认initWithFrame和创建此的UIView那么类调用initWithFrame后,将其伊娃的值,它实际上是在工作;不知怎的,drawRect获得这个iVar的价值,即使它被设置之后 UIView被初始化。

所以我需要以下两种情况之一:

1)信誉知道这是好的:我可以依靠drawRect某种程度上延缓了一下绘图所以高德被另一个对象设置的UIView初始化后。在这种情况下,只需在UIView初始化的时候是否会调用drawRect

或者,

2)我需要初始化期间传递值:这是创建一个自定义的初始化是需要超过(CGRect)frame作为一个参数为initWithFrame.它可以像这样简单的最佳方式:

myNewView=[[MyCustomView alloc] initWithFrame:myRect andMore:myValue]; 

然后在MyCustomView.m:

- (id)initWithFrame:(CGRect)frame andMore:(int)someValue 
    { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     myIvar=someValue; 
     ... //continue as normal 
    } 
    } 

请问这代码是一个很好的Appro公司ACH?然后,我会很舒服地知道,在调用drawRect之前,这个值是存在的。

+0

是的,你的第二种方法听起来很合理。 – Ilanchezhian 2012-04-11 07:24:47

回答

4

1.)您可以在任何init之后调用drawRect:。事实上,当视图绘图和合成完成时,将调用drawRect:,这通常是由于Core Animation提交的结果(如果修改任何CALayer或UIView(它们总是由CALayer支持)在runloop结束时完成))。

2.)从架构的角度来看,这种方法更好。如果你认为这个变量是你类的功能的一个不可或缺的部分(并且没有它,类不能正常工作),它肯定应该是一个init参数。您也可以考虑在其他init-Methods内部抛出NSInternalInconsistencyException(或任何其他异常)并/或将它们标记为已弃用(当调用super initWithFrame:时,init-Methods的超类仍然可以正常工作)。

1

简答:您的两种方法都应该正常工作。

较长的答案:

  1. drawRect:方法是所谓的runloop这样就不会被调用,直到完成做所有你正在初始化,然后放弃控制权返回给runloop。当然,如果你初始化视图,然后立即设置属性,你将不会有问题。

  2. 你的第二种方法应该工作得很好。

我会用第二种方法。

2

当您使用您指定的指定初始化程序以编程方式显式创建视图时,第二种方法非常理想。警告:如果视图是通过NIB构建的,则这将是而不是

1

Martin Ullrich正确地解决了这个问题。 但我想补充一点。

如果您在您的视图上调用initWithFrameinit。这不会使drawRect方法被调用。
当您将该视图添加到窗口时,并且in the next runLoop it will call this method会生成要在屏幕上显示的位图。