Жест контролирует сбой при вызове методов на C4WorkSpace.m

Я работаю со структурой C4 над проектом, и у меня возникли некоторые проблемы с использованием элементов управления жестами и вызова методов из C4WorkSpace.

Я нашел эту ссылку, которая была связана с этой проблемой, но, похоже, она не помешала моей программе выдать ошибку.

Немного предыстории: я создаю пользовательский класс кнопок, который имеет 4 свойства: UIColor, C4Shape и 2 float (x/y position). Я храню объекты пользовательских кнопок в массиве, и этот фрагмент кода собирается добавить жест к каждой кнопке и добавить его на холст.

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, а в основном рабочем пространстве. Я не уверен, что вызывает это или что я делаю неправильно? Есть ли что-то конкретное, что мне нужно написать в части "действия" метода?

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 файлы для вашего подкласса должны выглядеть так:

.час

#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 Listener

PS спасибо за попытку C4!


О, и это вывод, который я получаю в консоли XCode, когда я нажимаю на квадрат:

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

Это дает мне x а также y координаты, а также strokeColor кнопки, не добавляя их в качестве объектов к MyShape класс (потому что они уже существуют в C4Shape).

Другие вопросы по тегам