【发布时间】: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 文件。它设置了所有运行时函数。
-
@trojanfoe :我想过,但问题是,这只是应用程序的一部分。我有许多与形状类型相关的触摸手势,例如旋转、平移和通过捏合改变方向等。如果没有 UIView,这些事件是否可能?
-
@blancos 好点。然而,一层可能会稍微便宜一些,但我不确定要便宜多少。
标签: ios objective-c uiview core-graphics