0

使用 Interface Builder 时,很多时候我会将 Class 属性设置为我的自定义类之一。假设我在笔尖中有一个 UIView,我将类设置为我的MyView类。

这一切都很好,即使以编程方式加载 nib 也是如此。

但是,有没有办法在以编程方式加载笔尖时设置 UI 控件的类?原因是我有时想使用在 IB 中创建的相同 nib,但将它与不同的类相关联。

4

3 回答 3

1

我认为没有适当的方法可以以编程方式实现这一目标。

您可以在 IB 中创建一个裸 UIView 对象并给它一个标签或将其分配给一个 IBOutlet 以进行标识,这样您就可以在 viewDidLoad 中以编程方式访问它。

在 viewDidLoad 中,您可以访问它并获取它的框架和超级视图以及可能的背景颜色、alpha、隐藏状态等,以便您可以在 IB 中设置所有这些值。然后从其父视图中删除 UIView 并将属性(如果有)或分别释放对象(取决于 ARC 与否)。然后创建您需要的 UI 元素,将其分配给属性(如果有),将其添加到前 UIView 的父视图中,相应地设置其框架和属性,然后从那里开始。

(在 Obj-C 中有一些方法可以在实例化后更改对象的类,但我不建议在这种情况下这样做,尤其是当您的子类带有其他属性和 ivars 时。)

于 2013-08-28T07:38:13.787 回答
0

通常,您使用 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

然后在 viewDidLoad 方法内的类的 .m 部分中,您需要插入以下代码:

 // 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 类中声明的方法和刷新(它调用 drawRect 方法,您的 UIView 类中的主要入口点):

[(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.
 }
于 2015-10-02T18:30:04.300 回答
-2

尝试使用 Objective c 运行时的“object_setClass(id object, Class cls)”方法。祝你好运:)

于 2013-08-28T09:12:24.607 回答