如何找到一个实例的类,然后在objective-c中声明该类的另一个实例?
Posted
技术标签:
【中文标题】如何找到一个实例的类,然后在objective-c中声明该类的另一个实例?【英文标题】:How to find the class of a instance and then declare one more instance of that class in objective - c? 【发布时间】:2014-06-16 07:01:43 【问题描述】:我正在使用core-graphics
,在我的应用程序中,我正在绘制不同类型的形状并对其进行操作。所以我有大约 150 个UIView
对象(形状),可以由用户选择。
我有一个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
类,将来我会添加更多。那么有没有其他方法可以解决这个问题呢?
【问题讨论】:
您在参数中收到视图,为什么需要创建实例? 我相当肯定将这些形状作为UIView
的子类是错误的方法。更好的是创建一个名为Shape
(NSObject
的子类)的类,其属性类似于position
(CGPoint
)和一个名为draw
(在绘制父级UIView
时调用)的方法,然后从这个Shape
基类派生形状基元。
您可以忽略 Runtime.h 文件。它设置了所有运行时函数。
@***foe :我想过,但问题是,这只是应用程序的一部分。我有许多与形状类型相关的触摸手势,例如旋转、平移和通过捏合改变方向等。如果没有 UIView,这些事件是否可能?
@blancos 好点。然而,一层可能会稍微便宜一些,但我不确定要便宜多少。
【参考方案1】:
我认为为每个单独的形状创建一个子类并不是一个好主意。如果你有一个不规则形状的多边形,最好先声明一个像Polygon
这样的类,然后声明像numberOfSides
和area
这样的属性,甚至是NSArray* edges
或NSArray* angle
。然后你会有一个方法drawRectangle
,它将获取该数据并根据它拥有的帧在屏幕上呈现它。
Circular
和 Composite
可能是其他类,复合是由另外 2 个单独定义的形状组成的任何奇数形状。
我建议您重新考虑您的设计,使其更易于管理。您永远不必维护那么多类,这就是我们首先使用Polymorphism 的原因。
【讨论】:
同意。但正如我在 cmets 中提到的,我有很多触摸手势需要处理,具体取决于形状。 这些触摸手势也可以在类和基于边数和角度数的行为中实现。您觉得需要拥有这么多子类有什么问题? @blancos 旋转时,我会使用超类 (UIView) 实现进行旋转。这将旋转整个视图,这比旋转视图的内容要好(我假设这是你正在做的事情)。平移和定向可以与平移视图本身的方式相同。 触摸手势仅适用于 UIView。而且您的方法不是一次考虑多种形状。旋转超类 UIView 将旋转此时存在的所有形状。并且用户不能同时处理多个形状,因为所有形状都在一个视图中。 @blancos 你的形状是 UIViews 不是吗?这意味着它们本身就是一个视图,作为一个视图,它们支持旋转和触摸手势之类的东西。不要将super**class**
与super**view**
混淆。如果您旋转super**view**
,那么它也会旋转其所有同级视图。但是如果你使用它的super**class**
实现来旋转形状(视图),那么它只会旋转那个形状(视图)。以上是关于如何找到一个实例的类,然后在objective-c中声明该类的另一个实例?的主要内容,如果未能解决你的问题,请参考以下文章