簡體   English   中英

以編程方式設置IB對象的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM