Проблемы инициализации C4Shape Custom Subclass?

Я задал еще один вопрос относительно этого проекта, и Трэвис был очень полезным. Предыдущий вопрос

Принимая во внимание этот совет, я пытаюсь создать подкласс для класса C4Shape, я добавил 2 свойства (оба с плавающей запятой) к классу для значений положения X и Y. Причина, по которой я не просто вызываю свойство.center в C4Shape, заключается в том, что для добавления их на холст я предпочитаю использовать верхний левый угол вместо центра.

Я пытаюсь написать собственный метод Init для этого нового класса, однако получаю ошибку.

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

customShape.m

- (id)initWithColor:(UIColor *)fillColor atX:(float)_xValue atY:(float)_yValue
{
CGRect frame = CGRectMake(_xValue, _yValue, 100, 100);
self = [customShape rect:frame];

self.lineWidth = 0.0f;
self.fillColor = fillColor;
self.xValue = _xValue;
self.yValue = _yValue;


return self;
}

C4WorkSpace.m

-(void)setup {
customShape *testShape = [[customShape alloc]initWithColor:[UIColor greenColor] atX:50.0f atY:50.0f];

[self.canvas addShape:testShape];
}

Я подозреваю, что виновник self = [customShape rect:frame]; Это предупреждение, которое я вижу: "Несовместимый тип указателя, присваиваемый" customeShape *_strong "из" C4Shape * ""

Фактическая ошибка, возникающая при попытке запустить это: "Завершение приложения из-за необработанного исключения" NSInvalidArgumentException ", причина:" -[C4Shape setXValue:]: нераспознанный селектор, отправленный экземпляру 0x9812580 ""

Как и прежде, я делаю кнопки, которые могут содержать значение цвета, и когда вы нажимаете эту кнопку, она отправляет пакет UDP с этими кнопками fillColor, а также IPad IPads.

1 ответ

Решение

Вы довольно близки к реализации вашего метода init. Я бы перестроил это следующим образом:

- (id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint {
    self = [super init];
    if(self != nil) {
        CGRect frame = CGRectMake(0,0, 100, 100);
        [self rect:frame];
        self.lineWidth = 0.0f;
        self.fillColor = aColor;
        self.origin = aPoint;
    }
    return self;
}

Несколько вещей, чтобы отметить:

  1. При создании подклассов всегда хорошо вызывать метод init суперкласса объекта
  2. Это хорошая практика, чтобы обернуть init вашего подкласса в if оператор, проверяющий, правильно ли возвращен init суперкласса.
  3. Создайте рамку для вашего нового объекта и вызовите rect: на self непосредственно.
  4. Есть origin указывать на каждый видимый объект C4, поэтому вместо использования x а также y значения непосредственно, вы можете установить источник с помощью CGPoint (origin это верхний левый угол).

Затем вам нужно добавить этот метод в ваш .h файл:

@interface MyShape : C4Shape
-(id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint;
@end

Наконец, вы можете создать свою форму в вашем C4WorkSpace как это:

MyShape *m = [[MyShape alloc] initWithColor:[UIColor darkGrayColor]
                                     origin:CGPointMake(100, 100)];

И, если вы добавите строку к методу, который вы нажали, вы можете проверить точку начала кнопки:

-(void)heardTap:(NSNotification *)aNotification {
    MyShape *notificationShape = (MyShape *)[aNotification object];
    C4Log(@"%4.2f,%4.2f",notificationShape.center.x,notificationShape.center.y);
    C4Log(@"%4.2f,%4.2f",notificationShape.origin.x,notificationShape.origin.y);
    C4Log(@"%@",notificationShape.strokeColor);
}

Пока вы можете работать с x а также y значения как свойства, я рекомендую работать с CGPoint структур. Это почти то же самое, за исключением того, что вы переходите от C4 к Objective-C, вы заметите, что CGPoint и другие CG Геометрические структуры используются повсеместно.

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