Iphone 自定义UIView的initWithFrame
我正在尝试确定为UIView自定义初始值设定项的最佳方法,以便将值传递到初始值设定项中,并立即将其作为iVar存储在UIView子类中,因为该值对于Iphone 自定义UIView的initWithFrame,iphone,objective-c,uiview,uikit,Iphone,Objective C,Uiview,Uikit,我正在尝试确定为UIView自定义初始值设定项的最佳方法,以便将值传递到初始值设定项中,并立即将其作为iVar存储在UIView子类中,因为该值对于drawRect中的图形是必需的 目前我正在使用默认的initWithFrame,创建此UIView的类在调用initWithFrame后将其iVar设置为一个值,它实际上正在工作;不管怎样,drawRect正在获取这个iVar的值,即使它是在UIView初始化之后设置的 所以我需要两件事中的任何一件: 1) 有信心知道这一点是可以的:我可以依靠dr
drawRect
中的图形是必需的
目前我正在使用默认的initWithFrame
,创建此UIView的类在调用initWithFrame
后将其iVar设置为一个值,它实际上正在工作;不管怎样,drawRect
正在获取这个iVar的值,即使它是在UIView初始化之后设置的
所以我需要两件事中的任何一件:
1) 有信心知道这一点是可以的:我可以依靠drawRect
以某种方式延迟绘图一段时间,以便在初始化UIView后由另一个对象设置IVAR。在这种情况下,只有在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
}
}
这个代码是一个好方法吗?然后我就可以轻松地知道,在调用
drawRect
之前,该值就已经存在了。简短回答:两种方法都应该工作得很好
详细回答:
drawRect:
方法在runloop中被调用,因此在完成所有初始化并将控制权放弃回runloop之前不会被调用。当然,如果您初始化视图,然后立即设置属性,您将不会有问题我将使用第二种方法。当您使用指定的初始值设定项以编程方式显式创建视图时,第二种方法非常理想。警告:如果视图是通过NIB构建的,则不会出现这种情况。1。)您可以依赖于在任何
init
之后调用drawRect:
。事实上,视图绘制和合成完成时将调用drawRect:
,这通常是核心动画提交的结果(如果修改任何CALayer或UIView(始终由CALayer支持),则在运行循环结束时完成)
2.)从架构的角度来看,这种方法更好。如果你认为这个变量是你的类函数的一个不可分割的部分(并且如果没有它,类就不能正常工作),那么它肯定是一个init参数。您也可以考虑在其他init方法中抛出NSnInLalinNosiNeCyCype异常(或任何其他异常)和/或将它们标记为弃权(Unit方法的超类在调用<代码>超级Init框架:)时仍然很好。 < P> <强> Martin Ullrich < /强>正确地解决问题。 但我想补充一点 如果在视图上调用
initWithFrame
或init
。这不会使drawRect
方法被调用。当您将该视图添加到窗口中时,在下一次运行循环中,
将调用此方法,
,该方法将生成一个要在屏幕上取消显示的位图。是的,您的第二种方法看起来不错。