1

私のジレンマは次のとおりです。

UIImageのカスタムサブクラスがあり(いくつかのシリアル化メソッド、つまりinitWithCoder、encodeWithCoderを追加しました)、カスタムサブクラスを変数としてUIImageView、または少なくともUIImageViewのサブクラスに適用したいと思います。

ご存知のように、UIImageViewには、UIImageタイプの「image」という変数があります。この変数をサブクラスでオーバーライドしたいと思います。

私の目標は、encodeWithCoderメッセージが変数イメージに送信されても​​クラッシュせずにarchivedDataWithRootObjectに応答するUIimageViewを作成することです。そこにたどり着くためのより賢い方法があれば、私は提案を受け入れます。

ありがとうございました!

[編集]考えられるルートの1つは、ある種のキャスティングを経由することだと思います...しかし:

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

2行目が実行された後にmlImageにマウスを合わせると、タイプがMLImageであることがわかります。ただし、キャストを使用しても、3行目が実行されると、mlImageはUIImageになります。画像の種類をMLImageに変更するにはどうすればよいですか?[/編集]

4

1 に答える 1

1

用語に注意してください。プロパティをオーバーライドUIImageViewすることはできません。プロパティは引き続き独自のimageプロパティを持ち、置き換えられません。アクセサー-imageおよび)をオーバーライドしようとしています-setImage:

そして、あなたは正しいです、キャストはより良いルートです。しかし、あなたの例には問題があります:そのキャストは違法です。を実行すると[[UIImage alloc] init]、タイプのオブジェクトが作成されますUIImage。あなたのキャストを含め、それを変えるものは何もありません。UIImage*キャスティングは、コンパイラー(あなたの場合)に「これは、まあ、そうだと思うがUIImage、実際にはMLImage。」と伝える方法です。この場合、それは嘘です。なぜなら、それは実際には—あなたがUIImageそれをその場で割り当てたからです。

ただし、できることは、のプロパティに実際MLImageを貼り付けることです。例えば:imageUIImageView

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

そしてどこか他の場所:

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

そして、カスタム画像オブジェクトを取り戻します。MLImageしかし、そもそもそれがあったに違いありません。

于 2009-08-11T15:09:07.117 に答える