Как мне вызвать метод из C4Workspace с помощью [object addGesture...]?
Чего я надеюсь добиться, так это вызвать метод в C4Workspace.m, используя:
[shape addGesture:SWIPELEFT name:@"swipeLeft" action:@"leftSwipeMethod"];
Я знаю, что это попытка вызвать метод с именем "leftSwipeMethod" в классе C4Shape, но в документации также упоминается, что вы можете вызывать методы из суперкласса (что, я думаю, я пытаюсь сделать?).
Я проверил другие вопросы, подобные этому, и я знаю, что вы не должны делать это в обычной цели-c... но мне интересно, так ли это и с C4.
Есть ли другой способ получить тот же результат, или мне нужно создать подкласс?
1 ответ
Хорошо, самый простой способ сделать это - настроить свой холст на прослушивание правильного метода, который вызывается внутри C4Shape (на самом деле, это из любого C4Control, поэтому этот метод будет работать для всех визуальных объектов.
- Сначала создайте фигуру и добавьте ее на холст.
- Добавьте жест к форме, вызывая соответствующий
swipe
метод - Скажи холсту послушать
notification
из формы - Сделайте что-нибудь (т.е. измените цвет фигуры), когда холст услышит уведомление
Следующий код устанавливает форму:
@implementation C4WorkSpace {
C4Shape *s;
}
-(void)setup {
s = [C4Shape rect:CGRectMake(0, 0, 192, 96)];
s.center = self.canvas.center;
[s addGesture:SWIPELEFT name:@"leftSwipeGesture" action:@"swipedLeft"];
[self.canvas addShape:s];
[self listenFor:@"swipedLeft" fromObject:s andRunMethod:@"randomColor"];
}
-(void)randomColor {
s.fillColor = [UIColor colorWithRed:[C4Math randomInt:100]/100.0f
green:[C4Math randomInt:100]/100.0f
blue:[C4Math randomInt:100]/100.0f
alpha:1.0f];
}
@end
Тем не менее, это жестко запрограммировано... Хороший, более динамичный способ сделать это - слушать множество объектов и иметь randomColor:
метод, который также принимает уведомление, чтобы вы могли вытащить форму, которая делает уведомление.
@implementation C4WorkSpace {
C4Shape *s1, *s2;
}
-(void)setup {
s1 = [C4Shape rect:CGRectMake(0, 0, 192, 96)];
[s1 addGesture:SWIPELEFT name:@"leftSwipeGesture" action:@"swipedLeft"];
s2 = [C4Shape rect:CGRectMake(0, 0, 192, 96)];
[s2 addGesture:SWIPELEFT name:@"left" action:@"swipedLeft"];
s1.center = CGPointMake(self.canvas.center.x, self.canvas.center.y - s1.height * 1.25);
s2.center = CGPointMake(self.canvas.center.x, self.canvas.center.y + s2.height * 0.25);
NSArray *shapes = @[s1,s2];
[self.canvas addObjects:shapes];
[self listenFor:@"swipedLeft" fromObjects:shapes andRunMethod:@"randomColor:"];
}
-(void)randomColor:(NSNotification *)notification {
C4Shape *shape = (C4Shape *)notification.object;
shape.fillColor = [UIColor colorWithRed:[C4Math randomInt:100]/100.0f
green:[C4Math randomInt:100]/100.0f
blue:[C4Math randomInt:100]/100.0f
alpha:1.0f];
}
@end
Что нужно отметить во втором примере:
Во-первых, чтобы принять уведомление, используемый метод должен иметь формат:
-(void)randomColor:(NSNotification *)notification {}
Во-вторых, чтобы вызвать это имя метода, который вы используете в listenFor
должен иметь :
вот так:
@"randomColor:"
В-третьих, вы берете объект, который только что получил жест смахивания, вытягивая его из отправленного уведомления:
C4Shape *shape = (C4Shape *)notification.object;