Как мне вызвать метод из C4Workspace с помощью [object addGesture...]?

Чего я надеюсь добиться, так это вызвать метод в C4Workspace.m, используя:

[shape addGesture:SWIPELEFT name:@"swipeLeft" action:@"leftSwipeMethod"];

Я знаю, что это попытка вызвать метод с именем "leftSwipeMethod" в классе C4Shape, но в документации также упоминается, что вы можете вызывать методы из суперкласса (что, я думаю, я пытаюсь сделать?).

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

Есть ли другой способ получить тот же результат, или мне нужно создать подкласс?

1 ответ

Решение

Хорошо, самый простой способ сделать это - настроить свой холст на прослушивание правильного метода, который вызывается внутри C4Shape (на самом деле, это из любого C4Control, поэтому этот метод будет работать для всех визуальных объектов.

  1. Сначала создайте фигуру и добавьте ее на холст.
  2. Добавьте жест к форме, вызывая соответствующий swipe метод
  3. Скажи холсту послушать notification из формы
  4. Сделайте что-нибудь (т.е. измените цвет фигуры), когда холст услышит уведомление

Следующий код устанавливает форму:

@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;
Другие вопросы по тегам