使用Interface Builder时,很多时候我将Class属性设置为我的一个自定义类。假设我在笔尖中有一个UIView,我将该类设置为我的MyView
类。
即使以编程方式加载nib,这一切都很好。
但是,有没有办法在以编程方式加载nib时设置UI控件的类?原因是我想有时使用在IB中创建的相同的笔尖,但是它与不同的类相关联。
答案 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)”方法。好运:)