Переопределить переменную классов или, по крайней мере, тип переменной в target-c / cocoa - PullRequest
1 голос
/ 05 августа 2009

Моя дилемма заключается в следующем:

У меня есть собственный подкласс UIImage (я добавил несколько методов сериализации, то есть initWithCoder, encodeWithCoder), и я хотел бы применить свой пользовательский подкласс в качестве переменной к UIImageView или, по крайней мере, подкласс UIImageView.

Как вы знаете, в UIImageView есть переменная с именем "image", которая имеет тип UIImage. Я хотел бы переопределить эту переменную с моим подклассом.

Моя цель - создать UIimageView, который будет отвечать на archivedDataWithRootObject без сбоев, при этом сообщение encodeWithCoder отправляется в переменное изображение. Если есть более разумный способ добраться до меня, я открыт для предложений.

Спасибо!

[править] Я думаю, что один из возможных маршрутов - это какой-то тип приведения ... Однако:

UIImage *image = [[UIImage alloc] init];
MLImage *mlImage = [[MLImage alloc] init];
mlIamge = (MLImage*)image;

При наведении указателя мыши на mlImage после выполнения второй строки я вижу, что он имеет тип MLImage. Однако, даже с приведением, после выполнения третьей строки mlImage становится UIImage. Что мне нужно сделать, чтобы изменить тип изображения на MLImage? [/ Править]

1 Ответ

1 голос
/ 11 августа 2009

Будьте осторожны с вашей терминологией. Невозможно переопределить свойство - у UIImageView все еще будет свое собственное свойство image, оно не будет заменено. Вы пытаетесь переопределить средства доступа (-image и -setImage:).

И вы правы, кастинг - лучший путь. Но у вашего примера есть проблема: этот акт незаконен. Когда вы делаете [[UIImage alloc] init], вы создаете объект типа UIImage. Ничто не изменит этого, в том числе ваш актерский состав. Приведение - это способ сказать компилятору (в вашем случае): «Я знаю, вы думаете, что это UIImage*, ну, в общем, UIImage, но на самом деле это MLImage». В данном случае это ложь, поскольку на самом деле это UIImage - вы распределили это прямо здесь.

То, что вы можете сделать, - это вставить MLImage в image свойство UIImageView. Например:

MLImage *myImage = [[MLImage alloc] init];
myView.image = myImage;

А потом еще где-нибудь:

MLImage *myImage = (MLImage *)(myView.image);

И вы получите обратно свой пользовательский объект изображения. Но это должно было быть MLImage во-первых.

...