在C4WorkSpace.m上调用方法时,手势控件崩溃

时间:2013-05-02 01:18:15

标签: gesture c4

我正在使用项目中的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上的方法。我不确定是什么导致这个或我做错了什么?我需要在方法的“动作”部分写一些具体内容吗?

1 个答案:

答案 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

这为我提供了xy坐标,以及“按钮”的strokeColor,而无需将这些作为对象添加到MyShape类(因为它们已经存在于C4Shape)。