Проблемы с инициализацией пользовательского подкласса C4Shape?

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

Принимая во внимание этот совет, я пытаюсь создать подкласс для класса 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];. Это предупреждение, которое я вижу: «Несовместимый тип указателя, назначенный« customShape * _strong »из« C4Shape * »»

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

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


person BardiaD    schedule 04.05.2013    source источник


Ответы (1)


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

- (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. При создании подклассов всегда полезно вызывать метод инициализации суперкласса объекта.
  2. Хорошей практикой является обернуть init вашего подкласса в оператор if, проверяя, правильно ли возвращается инициализация суперкласса.
  3. Создайте рамку для вашего нового объекта и вызовите rect: на self напрямую.
  4. В каждом видимом объекте C4 есть точка origin, поэтому вместо прямого использования значений 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)];

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

-(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 используются везде.

person C4 - Travis    schedule 05.05.2013
comment
Без проблем! Продолжайте задавать вопросы. - person C4 - Travis; 06.05.2013