Жест контролирует сбой при вызове методов на 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
).