使用 Interface Builder 时,很多时候我会将 Class 属性设置为我的自定义类之一。假设我在笔尖中有一个 UIView,我将类设置为我的MyView
类。
这一切都很好,即使以编程方式加载 nib 也是如此。
但是,有没有办法在以编程方式加载笔尖时设置 UI 控件的类?原因是我有时想使用在 IB 中创建的相同 nib,但将它与不同的类相关联。
使用 Interface Builder 时,很多时候我会将 Class 属性设置为我的自定义类之一。假设我在笔尖中有一个 UIView,我将类设置为我的MyView
类。
这一切都很好,即使以编程方式加载 nib 也是如此。
但是,有没有办法在以编程方式加载笔尖时设置 UI 控件的类?原因是我有时想使用在 IB 中创建的相同 nib,但将它与不同的类相关联。
我认为没有适当的方法可以以编程方式实现这一目标。
您可以在 IB 中创建一个裸 UIView 对象并给它一个标签或将其分配给一个 IBOutlet 以进行标识,这样您就可以在 viewDidLoad 中以编程方式访问它。
在 viewDidLoad 中,您可以访问它并获取它的框架和超级视图以及可能的背景颜色、alpha、隐藏状态等,以便您可以在 IB 中设置所有这些值。然后从其父视图中删除 UIView 并将属性(如果有)或分别释放对象(取决于 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
然后在 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.
}
尝试使用 Objective c 运行时的“object_setClass(id object, Class cls)”方法。祝你好运:)