[英]Programmatically set an IB object's Class
當使用Interface Builder,很多時候我的類屬性設置為我的自定義類之一。 假設筆尖中有一個UIView,並將該類設置為MyView
類。
即使以編程方式加載筆尖,這也很好。
但是,有沒有一種方法來設置UI控件的類編程時加載一個筆尖? 原因是,我想有時使用在IB創建的相同筆尖,但已經將其與不同類別相關聯。
我認為沒有以編程方式實現該目標的正確方法。
您可以在IB中創建一個裸露的UIView對象,並為其提供標簽或將其分配給IBOutlet進行標識,以便可以在viewDidLoad中以編程方式訪問它。
在viewDidLoad中,您可以訪問它並獲取其框架和預覽以及可能的背景色,alpha,隱藏狀態等,以便可以在IB中設置所有這些值。 然后從其超級視圖中刪除UIView並將該屬性設置為nil(如果有)或分別釋放該對象(取決於ARC)。 然后創建所需的UI元素,將其分配給屬性(如果有),將其添加到以前的UIView的超級視圖中,相應地設置其框架和屬性,然后從那里開始。
(Obj-C中有多種方法可以在實例化對象后更改其類,但是在這種情況下,我不建議這樣做,尤其是當您的子類帶有其他屬性和ivars時。)
通常,您可以使用Interface Builder在UIViewController的XIB類文件上創建一個UIView對象,然后使用Identity Inspector中的“自定義類”工具將UIView與一個類相關聯(該類是一個UIView類,其中包含用於繪制UIView對象的代碼)。 然后,您必須在UIViewController類中使用@property和@systhesize將UIView(使用連接檢查器)鈎接到類上。 這種方法可以,但是在某些情況下有局限性。
您可以務實地解決所有這些問題。
創建將用於繪制UIView對象的UIView類。 在該類中,您創建上下文引用(CGContextRef),以為繪圖工具提供用於字符串,線條,圓圈等事物的上下文(繪制位置)。
CGContextRef gg = UIGraphicsGetCurrentContext();
在UIViewController類中,需要在.h文件中導入對UIView類的引用。 稱之為:DrawOnView
#import "DrawOnView.h"
然后在包含@interface的方括號中放置以下行:
UIView * draw; // draw can be changed to any name that suits your needs
然后,在類的.m部分的viewDidLoad方法內,您需要插入以下代碼:
// Make the size and location that suits your needs
// You can change this on the go in your code as needed, such as if the
// device orientation is changed.
draw = [DrawOnView alloc] initWithFrame:CGRectCreate(50, 50, 100, 200)];
// You can change the background color of the view, if you like:
[draw setBackGroundColor:[UIColor greenColor]];
// Now add the view to your primary view
[self.view addSubview:draw];
現在,在程序的其他部分,您可以使用以下引用來調用在DrawOnView類中聲明的方法並刷新(該方法調用UIView類的主要入口點drawRect方法):
[(DrawOnView*) draw setNeedsDisplay];
這個非常重要。 不使用:
[draw setNeedsDisplay]; // This will not work!
假設您在DrawOnView中定義了其他方法,並想調用它們。
這是一個示例方法(在.h文件中):
-(BOOL) wasHotSpotHit: (CGPoint) p;
實際方法可能如下所示(在.m文件中):
-(BOOL) washHotSpotHit: (CGPont) p
{
if(CGRectContainsPont(hotspot.frame, p))
{
return true;
}
return false;
}
使用如下代碼:
if([(DrawOnView*) draw testIfSpotHit:p])
{
// Do something for when user touches hot spot.
}
嘗試使用Objective c運行時的“ object_setClass(id object,Class cls)”方法。 祝好運:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.