以编程方式设置IB对象的类

时间:2013-08-28 07:11:04

标签: ios objective-c xcode cocoa-touch interface-builder

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

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

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

3 个答案:

答案 0 :(得分:1)

我认为没有一种正确的方法可以以编程方式实现。

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

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

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

答案 1 :(得分:0)

通常使用Interface Builder在UIViewController的类XIB文件上创建一个UIView对象,然后使用Identity Inspector中的Custom Class工具将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.
 }

答案 2 :(得分:-2)

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