我正在使用项目中的C4框架,我在使用手势控件和调用C4WorkSpace方法时遇到了一些麻烦。
我发现this link与此问题有关,但似乎并没有阻止我的程序抛出错误。
一点背景:我正在创建一个具有4个属性的自定义按钮类:UIColor,C4Shape和2个浮点数(x / y位置)。我将自定义按钮对象存储在一个数组中,并让这段代码为每个按钮添加一个手势并将其添加到画布中。
C4WorkSpace.m
for (button in buttonArray){
[button.shape addGesture:TAP name:@"tapGesture" action:@"tapped"];
[self.canvas addShape:button.shape];
[self listenFor:@"tapped" fromObject:button andRunMethod:@"doThis:"];
}
我在' - (void)setup'之外还有一个函数,它只打印一条日志消息:
-(void)doThis:(NSNotification *)notification{
NSLog(@"notification test");
}
我已经使用类别扩展了我的C4Shape类,当我调用此方法时它可以正常工作:
#import "C4Shape+myC4Shape.h"
@implementation C4Shape (myC4Shape)
-(void)printTest{
NSLog(@"this is a print test");
}
@end
当我尝试点击按钮时,我得到的错误被抛出,它说:由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [C4Shape tapped]:发送到实例的无法识别的选择器0x931e9c0'
我将“动作”设置为“点击”,但这只是我编写的内容。我知道这通常会在shape类中调用一个方法,但我试图调用一个不在C4Shape类中但在主WorkSpace上的方法。我不确定是什么导致这个或我做错了什么?我需要在方法的“动作”部分写一些具体内容吗?
答案 0 :(得分:1)
这个Obj-C的东西起初可能会令人困惑。希望这会有所帮助。
我注意到有两件事要你改变。
首先是你的TAP
手势。当您将其添加到代码中时,您实际上是在告诉手势识别TAP然后运行tapped
方法。但是,此方法不存在(因此-[C4Shape tapped]: unrecognized selector sent to instance 0x931e9c0
)。您的代码中应该有一个名为-(void)tapped{};
的方法,以便此消息消失。
以下代码说明了这一点:
@implementation C4WorkSpace
-(void)setup {
[self addGesture:TAP name:@"tap" action:@"tapped"];
}
-(void)tapped {
C4Log(@"tapped!");
}
@end
将它放入形状非常相似。
其次,对于子类化,C4Shape(以及所有其他可视对象)继承自C4Control,因此我建议将C4Control子类化不是最好的方法。要使用C4Shape创建自己的自定义按钮,我会直接将C4Shape子类化。
对于子类C4Shape,上面的代码看起来完全相同,只是如果你创建了MyShape子类,那么代之以@implementation MyShape
。
最后,您希望在tap
方法中添加一条小广播消息,以便画布可以监听它...所有.h
和.m
文件都包含在您的文件中子类应如下所示:
·H
#import "C4Shape.h"
@interface MyShape : C4Shape
@end
的.m
#import "MyShape.h"
@implementation MyShape
-(void)setup {
[self addGesture:TAP name:@"tap" action:@"tapped"];
}
-(void)tapped {
[self postNotification:@"tapNotification"];
}
@end
最后,使用项目中的这两个文件,您可以将以下内容添加到工作区:
#import "C4WorkSpace.h"
#import "MyShape.h"
@implementation C4WorkSpace
-(void)setup {
MyShape *m = [[MyShape alloc] init];
[m rect:CGRectMake(0, 0, 100, 100)];
m.center = self.canvas.center;
[self.canvas addShape:m];
[self listenFor:@"tapNotification" fromObject:m andRunMethod:@"heardTap:"];
}
-(void)heardTap:(NSNotification *)aNotification {
MyShape *notificationShape = (MyShape *)[aNotification object];
C4Log(@"%4.2f,%4.2f",notificationShape.center.x,notificationShape.center.y);
C4Log(@"%@",notificationShape.strokeColor);
}
@end
这是一个gist的链接,其中包含您运行该文件所需的3个文件。
Button Subclass with Canvas Listener
PS感谢你试试C4!
哦,这是我点击广场时Xcode控制台输出的输出:
[C4Log] 384.00,512.00
[C4Log] UIDeviceRGBColorSpace 1 0.1 0.1 1
这为我提供了x
和y
坐标,以及“按钮”的strokeColor
,而无需将这些作为对象添加到MyShape
类(因为它们已经存在于C4Shape
)。