2013-08-28 42 views
0

使用Interface Builder时,很多时候我将Class属性设置为我的一个自定义类。假设我在笔尖有一个UIView,并且将该类设置为我的MyView类。以编程方式设置IB对象的类

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

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

回答

1

我不认为有一个正确的方法来实现这一目标。

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

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

(有在OBJ - C的方式其instanciation后改变对象的类,但我不建议这样做,在这种情况下,尤其是当你的子类都具有附加属性和实例变量。)

+0

感谢您的详细解释 - 您说服了我。在玩游戏时,我决定通过在UIView类中使用委托来完成一些我最初尝试继承(以及我的问题)的小事情。现在对我来说感觉更好,而且更像可可一样。 – dbarros

-2

使用try ObjectiveC运行时的“object_setClass(id对象,Class cls)”方法。 GoodLuck :)

+0

你应该解释这个建议的后果和限制。 Isa搅拌很复杂。 –

+0

要使用'object_setClass(id对象,Class cls)'方法,您必须使用'#include Aznix

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. 
} 
相关问题