UIBezierPath: метод appendPath теряет информацию о каждом отдельном пути

проблема в этом...

Я создал класс, который расширяет UIBezierClass, называемый PathExtended, в который я добавил идентификатор NSString;

Итак, у меня есть массив PathExtended. В методе drawrect я написал:

p = [[PathExtended alloc] init];

for (int i=0; i<[arrayOfPaths count]; i++) {

    [p appendPath:[arrayOfPaths objectAtIndex:i]];
    [p closePath];
}

[p applyTransform:CGAffineTransformMake(a, b, c, d, e, f)];
[p fill];

Теперь, если я проверю метод touchend:

if ([p containsPoint:pointTouched]) {
            NSLog(@"There is!");
        }

Ничего страшного!!! Вместо этого, если я проверю:

if ([p containsPoint:pointTouched]) {
            NSLog(@"ID= %@", p.ID);
        }

Лог пустой!!

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

Есть идеи??? Извините за мой английский (я итальянец: P)

РЕДАКТИРОВАТЬ:

Расширенный путь .h

@interface PathExtended : UIBezierPath {

NSString* ID;
}

@property (nonatomic, readwrite) NSString* ID;

-(id) initwithID:(NSString*) _ID;

person kinghomer    schedule 05.09.2011    source источник
comment
Где вы устанавливаете поле ID?   -  person Perception    schedule 06.09.2011
comment
В другом классе. Если я проверю это здесь, в методе drawrect: [p appendPath:[arrayOfPaths objectAtIndex:i]]; NSLog(@%@, p.ID); [p закрытьПуть]; Оно работает!!   -  person kinghomer    schedule 06.09.2011
comment
Разместите соответствующий код из файла заголовка PathExtended, показывающий объявление вашего свойства ID.   -  person Perception    schedule 06.09.2011


Ответы (1)


Представьте, что произойдет, если вы создадите подкласс NSDecimalNumber, назовите его MyImaginaryNumber, чтобы ваш подкласс хранил воображаемый компонент. Что произойдет, если вы попытаетесь вызвать такой метод, как -decimalNumberByAdding:? Вы же не ожидаете, что реализация этого метода в NSDecimalNumber будет включать вашу мнимую часть в результирующее число, не так ли? Очевидно, что NSDecimalNumber ничего не знает о мнимой части, поэтому нельзя ожидать, что он будет действовать правильно.

Если вы хотите, чтобы -appendPath: работал с вашими объектами PathExtended, вам нужно переопределить -appendPath: реализацией, которая сохраняет дополнительную информацию в PathExtended. Вы по-прежнему можете вызывать реализацию UIBezierPath из своей собственной, если это, конечно, полезно. Например, если ваши идентификаторы составные, вы можете сделать что-то вроде:

-(PathExtended*)appendPath:(PathExtended*)path
{
    PathID newID = [self composeID:path.ID];
    PathExtended *newPath = [PathExtended pathWithBezierPath:[super appendPath:path] ID:newID];
    return newPath;
}

Я не уверен, почему ваше сообщение журнала вообще не печаталось, если это произошло, но, вероятно, это связано с тем, что UIBezierPath не имеет свойства ID.

person Caleb    schedule 06.09.2011
comment
Мммм... я понял, что ты имеешь в виду. Правильно, метод appendPath не знает свойства ID. Я проверю и сообщу вам об этом. - person kinghomer; 06.09.2011
comment
Я не знаю, как я могу сделать! Я думал о реализации, но ничего. Можете вы помочь мне ? - person kinghomer; 06.09.2011