2014-06-16 44 views
0

我正在与core-graphics合作,并在我的应用程序中绘制不同类型的形状并操作它们。所以我有大约150 UIView对象(形状),可以由用户选择。如何查找实例的类,然后在objective-c中声明该类的另一个实例?

我有一个NSObject类,它有滑块来改变形状的大小。因此,我将视图实例从每个UIView传递到此类NSObject以修改其大小。

NSObject类我有一个函数象下面这样:

-(id) initWithView:(id)shapeView 
{ 
    ... 
} 

所以在运行时,当用户选择一个形状并移动形状的实例传递给这个函数在NSObject类中的滑块。现在我可以操纵特定“shapeView”的大小。

但问题是我不能访问它所属的类的UIView的功能。

我不能用类似下面因为shapeView的类型是在编译时未知的,它抛出错误:

[shapeView someFunction:]; 

例如用户选择一个矩形的应用程序。然后ShapeView的Class类型是Rectangle。我可以使用[view class]找出这个。所以我可以修改矩形的大小,但不能访问它的功能。要访问函数,我必须在NSObject类中声明Rectangle类型的实例。所以我的问题是如何从实例中提取类名称(在这种情况下是shapeView)并声明该类类型的实例。

我知道一种方法是检查每种类型的UIView类的类型,然后相应地创建实例。但正如我所说,有150 UIView类,在未来我会增加更多。那么有没有其他解决这个问题的方法?

+0

您正在接收参数中的视图,为什么您需要创建实例? – Apurv

+0

我相当肯定,使这些形状成为“UIView”的一个子类是错误的方法。更好的方法是创建一个名为'Shape'的类('NSObject'的一个子类),它具有'position'('CGPoint')和一个名为'draw'的方法(绘制父'UIView'时调用),然后从这个'Shape'基类中派生形状基元。 – trojanfoe

+0

您可以忽略Runtime.h文件。它正在设置所有运行时功能。 – Apurv

回答

0

我不认为这是一个好主意,每个单独的形状的子类。如果宣布像Polygon这样的类,然后宣布属性如numberOfSidesarea甚至NSArray* edgesNSArray* angle如果您具有不规则形状的多边形本应更好。然后你会有一个方法drawRectangle,它将获取该数据并基于它的帧显示在屏幕上。

CircularComposite本来可以是其他类,复合是任何奇怪的形状,由2个单独定义的形状组成。

我会建议你重新考虑你的设计,使其更易于管理。你永远不应该维护那么多类,这就是为什么我们首先使用Polymorphism

+0

同意。但正如我在评论中提到的,我有许多触摸手势要根据形状来处理。 – blancos

+0

这些touchgestures也可以在类中实现,并根据边和​​角度的数量来实现。你有什么问题,你觉得你需要有那么多的子类? – Literphor

+0

@blancos旋转时,我只需使用超类(UIView)实现进行旋转。这将旋转整个视图,这比旋转视图的内容更好(我正在玩弄你正在做的事情)。在平移视图本身的情况下,平移和方向可以按照相同的方式完成。 – Literphor

相关问题