Iphone 自定义UIView的initWithFrame

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

我正在尝试确定为UIView自定义初始值设定项的最佳方法,以便将值传递到初始值设定项中,并立即将其作为iVar存储在UIView子类中,因为该值对于
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
    方法被调用。

    当您将该视图添加到窗口中时,在下一次运行循环中,
    将调用此方法,
    ,该方法将生成一个要在屏幕上取消显示的位图。

    是的,您的第二种方法看起来不错。