2012年7月17日火曜日



ボタンを押された時に行う処理が少しだけ違うけど ほとんど同じという場合、処理をまとめて1つにしたくなるのがプログラマのサガ(笑)。

たとえば、supportalでは押したボタンに応じて、違うURLが開くというボタンがあります。 それを、ボタン自体がURLの情報を持っていて、ボタンが押された時の処理の中で、ボタンの自身がもつ情報で処理を切り替えるという設計をしたのです。


そうしたらハマリました。ガッツリっと(苦笑)。
具体的には、UIButtonのサブクラスMyUIButtonを作って、プロパティを追加したのです。 そうすると、ストールする現象にあいました。

しかも、ボタンの種類がUIButtonTypeCustomの時は問題ないのに、UIButtonTypeRoundedRectにするとストールする!

いくら考えても、意味不明。。。(角丸にしたらダメってどういうこと?? とハテナ飛びまくりです)


分からないものはしかたがないので、とりあえず、UIButtonTypeCustomで作ることにして先に進みました。




しばらくして、原因は基礎勉強中に判明しました。

ここに NSStringの例が乗っているのですが、UIButtonの場合もほぼ同じ。
UIButtonは、ほぼほぼFactory Methodとしてのクラスクラスタというデザインパターンで作られているみたい。ただし、純粋な抽象クラスではないところが、話を複雑にしているようでした。
 

つまり、私はMyUIButtonのインスタンスを作っているつもりだったのですが、違っていました。 たしかにUIButtonTypeCustomのスタイルの時は正しくMyUIButtonのインスタンスが作られていたけれど、UIButtonTypeRoundedRectにするとUIRoundRectButtonのインスタンスが作られてしまっていたのです。

当然、その時はUIButtonのサブクラスとして機能していないので、私が作ったプロパティを持っていない。 そこにアクセスするものだからストールしていたわけ。


で、どうしたか。。。 必ずUIButtonTypeCustomで作ることにしました。
原因が分かってもやってることは相変わらず(苦笑)。

まぁ、原因が分かってスッキリ!!が大事なのです。 たぶん(笑)

Tagged: , ,

0 コメント: