Создание классов C4

Я пытаюсь написать новый класс внутри проекта C4-Libpd. Все, что я хочу сделать, - так это то, что я хочу узнать, как управлять классами в Objective-C, получая функциональность из "последовательного" кода, который я написал, в более объектно-ориентированном виде. Одна из проблем, с которыми я сталкиваюсь, заключается в том, как добавить addShape на холст как метод нового класса:

- (void) displayCrosshair{

    [self.canvas addShape:xLine];
    [self.canvas addShape:yLine];
    [self.canvas addShape:s];

}

дает мне ошибку:

Свойство canvas не найдено на объекте типа...

Я это понимаю self.canvas изнутри класса это не правильно, если я не создал еще один холст внутри класса, если я хочу добавить Shape на основной холст и просто использовать метод для работы с объектами. Итак, какой правильный способ сделать это?

1 ответ

Решение

Один из самых простых способов заставить вещи происходить на холсте, когда метод или действие происходит в отдельном объекте, - это использовать уведомления. Использование уведомлений делает 2 вещи, это позволяет другим объектам реагировать на события по-своему, и это позволяет разъединять (то есть не жестко кодировать) ссылки на объекты.

Вы можете публиковать уведомления, как это:

@interface MyClass : C4Shape
-(void)displayCrosshair;
@end

@implementation MyClass
-(void)displayCrosshair {
    [self postNotification:@"displayCrosshairNotification"];
}
@end

Затем, чтобы заставить холст прослушивать уведомление, вы можете сделать это:

-(void)setup {
    C4Shape *crossHair = ...;
    crossHair.hidden = YES;
    [self.canvas addShape:crossHair];
    [self listenFor:@"displayCrosshairNotification" fromObject:obj andRunMethod:@"displayCrosshair"];
}

-(void)displayCrosshair {
    crossHair.hidden = NO;
}

Кроме того, вы можете установить свойство в своем подклассе для холста:

@interface MyClass : C4Shape
@property (readwrite, nonatomic) C4View *canvas;
@end

... а затем сделать жесткую ссылку на ваш холст, когда вы создаете свой подкласс в C4WorkSpace.m вот так:

@implementation C4WorkSpace {
    MyClass *obj;
}

-(void)setup {
    obj = [[MyClass alloc] init];
    obj.canvas = self.canvas;
    [self.canvas addSubview:obj];
}

Этот трюк должен работать, но я предпочитаю метод уведомления.


Заключительная мысль... Если подклассный объект, о котором вы говорите, на самом деле является перекрестием, то я бы даже не стал беспокоиться об уведомлении на холсте.

Вместо этого я бы создал перекрестие в качестве подкласса C4Shape, чтобы оно управляло собственной видимостью:

На холсте:

-(void)setup {
    MyShape *crossHair = [[MyShape alloc] initWithFrame:...];
    [self.canvas addShape:crosshair];
}

В вашей форме подкласс:

@interface MyShape : C4Shape
-(void)displayCrosshair;
-(void)hideCrosshair;
@end

@implementation MyShape
-(void)setup {
    [self addShape:xLine];
    [self addShape:yLine];
    [self hideCrosshair];
}

-(void)displayCrosshair {
    self.hidden = NO;
}

-(void)hideCrosshair {
    self.hidden = YES;
}
@end

Что, вероятно, лучший подход.

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