2009-08-04 7 views
1

Mon dilemme est le suivant:classes override variables, ou au moins de type variable objective-c/cacao

J'ai une sous-classe personnalisée de UIImage (je l'ai ajouté quelques méthodes de sérialisation-à-dire initWithCoder, encodeWithCoder), et Je voudrais appliquer ma sous-classe personnalisée en tant que variable à un UIImageView, ou au moins à une sous-classe de UIImageView. Comme vous le savez, UIImageView a une variable appelée "image", qui est de type UIImage. Je voudrais remplacer cette variable par ma sous-classe.

Mon objectif est d'avoir un UIimageView qui répondra à archivéDataWithRootObject sans écraser avec le message encodeWithCoder est envoyé à l'image variable. S'il y a un moyen plus intelligent d'y arriver, je suis ouvert aux suggestions.

Merci!

[modifier] Je pense que l'on voie possible est par un certain type de casting ... Cependant:

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

Quand je souris sur mlImage après exécute la deuxième ligne, je peux voir qu'il est de type MLImage. Cependant, même avec la distribution, après l'exécution de la troisième ligne, mlImage devient un UIImage. Que dois-je faire pour changer le type d'image en MLImage? [/ edit]

Répondre

1

Soyez prudent avec votre terminologie. Il n'est pas possible de outrepasser une propriété-le UIImageView aura toujours sa propre propriété image, il ne sera pas remplacé. Vous essayez de remplacer les accesseurs (-image et -setImage:).

Et vous avez raison, le casting est un meilleur itinéraire. Mais votre exemple a un problème: cette distribution est illégale. Lorsque vous faites [[UIImage alloc] init], vous créez un objet de type UIImage. Rien ne va changer cela, y compris votre distribution. Casting est une façon de dire au compilateur (dans votre cas) "Je sais que vous pensez que ce UIImage* est, bien, un UIImage, mais c'est vraiment un MLImage." Dans ce cas, c'est un mensonge, puisque c'est vraiment un UIImage -vous l'avez alloué juste là.

Qu'est-ce que vous pouvez faire, cependant, est un bâton MLImage réelle dans la propriété d'un imageUIImageView. Par exemple:

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

Et puis un autre endroit:

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

Et vous récupérerez votre objet image personnalisée. Mais il doit avoir été un MLImage en premier lieu.