2012-04-11 68 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會生成要在屏幕上顯示的位圖。