2014-06-16 89 views
0

我正在與core-graphics合作,並在我的應用程序中繪製不同類型的形狀並操作它們。所以我有大約150 UIView對象(形狀),可以由用戶選擇。如何查找實例的類,然後在objective-c中聲明該類的另一個實例?

我有一個NSObject類,它有滑塊來改變形狀的大小。因此,我將視圖實例從每個UIView傳遞到此類NSObject以修改其大小。

NSObject類我有一個函數象下面這樣:

-(id) initWithView:(id)shapeView 
{ 
    ... 
} 

所以在運行時,當用戶選擇一個形狀並移動形狀的實例傳遞給這個函數在NSObject類中的滑塊。現在我可以操縱特定「shapeView」的大小。

但問題是我不能訪問它所屬的類的UIView的功能。

我不能用類似下面因爲shapeView的類型是在編譯時未知的,它拋出錯誤:

[shapeView someFunction:]; 

例如用戶選擇一個矩形的應用程序。然後ShapeView的Class類型是Rectangle。我可以使用[view class]找出這個。所以我可以修改矩形的大小,但不能訪問它的功能。要訪問函數,我必須在NSObject類中聲明Rectangle類型的實例。所以我的問題是如何從實例中提取類名稱(在這種情況下是shapeView)並聲明該類類型的實例。

我知道一種方法是檢查每種類型的UIView類的類型,然後相應地創建實例。但正如我所說,有150 UIView類,在未來我會增加更多。那麼有沒有其他解決這個問題的方法?

+0

您正在接收參數中的視圖,爲什麼您需要創建實例? – Apurv

+0

我相當肯定,使這些形狀成爲「UIView」的一個子類是錯誤的方法。更好的方法是創建一個名爲'Shape'的類('NSObject'的一個子類),它具有'position'('CGPoint')和一個名爲'draw'的方法(繪製父'UIView'時調用),然後從這個'Shape'基類中派生形狀基元。 – trojanfoe

+0

您可以忽略Runtime.h文件。它正在設置所有運行時功能。 – Apurv

回答

0

我不認爲這是一個好主意,每個單獨的形狀的子類。如果宣佈像Polygon這樣的類,然後宣佈屬性如numberOfSidesarea甚至NSArray* edgesNSArray* angle如果您具有不規則形狀的多邊形本應更好。然後你會有一個方法drawRectangle,它將獲取該數據並基於它的幀顯示在屏幕上。

CircularComposite本來可以是其他類,複合是任何奇怪的形狀,由2個單獨定義的形狀組成。

我會建議你重新考慮你的設計,使其更易於管理。你永遠不應該維護那麼多類,這就是爲什麼我們首先使用Polymorphism

+0

同意。但正如我在評論中提到的,我有許多觸摸手勢要根據形狀來處理。 – blancos

+0

這些touchgestures也可以在類中實現,並根據邊和​​角度的數量來實現。你有什麼問題,你覺得你需要有那麼多的子類? – Literphor

+0

@blancos旋轉時,我只需使用超類(UIView)實現進行旋轉。這將旋轉整個視圖,這比旋轉視圖的內容更好(我正在玩弄你正在做的事情)。在平移視圖本身的情況下,平移和方向可以按照相同的方式完成。 – Literphor

相關問題