2

我在一个项目中使用 C4 框架,但在使用手势控件和从 C4WorkSpace 调用方法时遇到了一些麻烦。

我发现这个链接与这个问题有关,但它似乎并没有阻止我的程序抛出错误。

一点背景知识:我正在创建一个自定义按钮类,它有 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'

我将我的“动作”设置为“点击”,但这只是我编造的。我知道这通常会调用形状类中的方法,但我试图调用不在 C4Shape 类中而是在主 WorkSpace 中的方法。我不确定是什么导致了这种情况或我做错了什么?我需要在方法的“动作”部分写些什么具体的东西吗?

4

1 回答 1

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

这是一个要点链接,其中包含运行此程序所需的 3 个文件。

带有 Canvas 侦听器的按钮子类

PS感谢您尝试C4!


哦,这是我点击方块时在 Xcode 控制台中得到的输出:

[C4Log] 384.00,512.00
[C4Log] UIDeviceRGBColorSpace 1 0.1 0.1 1

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

于 2013-05-03T16:34:26.890 回答