どのように私は、カテゴリ内のオーバーロードされた関数から元の関数を呼び出すのですか?
-
19-09-2019 - |
質問
のObjective-Cでは、私はクラスのカテゴリを持っています:
@interface UILabel(CustomInit)
- (id)initWithCoder:(NSCoder *)coder;
@end
私は何をやっていることは、いくつかの余分なものを行うカスタムinit関数を書いている、と私は何をしたいのですが、UILabelの基本initWithCoderを呼び出し、このカスタムinit関数です。これは可能ですか?どのように?
の編集の
ありがとう。 [OK]を、私の計画は議論の余地そう。ただinitWithCoderをオーバーロードすることはできません。 initWithCoderに過負荷をかけることなく、(すべてのUILabelsは、この追加の初期化ステップを取得する)同じ機能を実現する方法はありますか?それとも、私はちょうど追加されたコードを書き換えることができることをUILabelのinitWithCoderのサンプルコードはありますか?
の編集の
[OK]を、ので、私はしようとしているかについて明確にします
私はiPhoneでカスタムフォントを埋め込むことができますアプリケーションですか
は、誰かが手動でプライベートGraphicServices機能GSFontAddFromFileを使用して、iPhone上でカスタムフォントを追加した答えを持っています。私はこのコードを試してみました、それは手動でラベルのフォントを設定するために素晴らしい仕事しました。しかし、あなたがInterface Builderでフォントを設定しようとした場合、それが正しくロードされない、それだけでシステムフォントまで低下します。私は何をしたかったことは、手動でフォントをロードし、IBで選択したフォントを使用して自動的にラベルのフォントを設定しました。このように私は置くすべてのラベルのための出口を作成する必要はありません。また、私はかなりグロテスクた(また、そのスレッドで提案し、カスタム描画を大量に行いました)ばかげラベルサブクラスを記述する必要はありません。今、私はまだ私のすべてのラベルのサブクラスを作ることができるが、その後、他のUIオブジェクトに埋め込まれたラベル、すなわちUIButtonsの場合があります。また、私は壊れていないために埋め込まれたラベルをしたいと思います。
任意の提案は素晴らしいことです。おかげます。
解決 2
あなたたちはこの感じはどうすればよいですか?
実行時にinitWithCoderの元のメソッドアドレスをつかみ、静的変数に格納。私のinitWithCoderを持つクラスの実装を交換することで、メソッドスウィズルを行います。そして、私のinitWithCoderに、私は静的変数に保存されている元のメソッドを呼び出します。
あなたは作り、カテゴリーに入れてプログラムの開始時に、このクラスの初期化ステップを呼び出すことができ、それが二回呼び出すことはできません、またはそれがあるならば、それは何もしないことを確認ます。
これは危険なようだが、それが動作するはずような気がします。
他のヒント
<のhref = "からhttp://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20- SW1" のrel = "noreferrer">マックOS Xリファレンスライブラリはをます:
場合は、カテゴリオーバーライドが継承されたの 方法を、カテゴリ内の方法 、いつものように、継承を呼び出すことができます スーパーへのメッセージを経由して実装。 しかし、カテゴリがオーバーライドする場合 すでに存在していた方法の のカテゴリのクラスは、に方法はありません 元の実装を起動します。
メソッドのスウィズリング作業をする必要があります。
あなたの正確な同じ質問がエヴァン人形で、このスタンフォードiTunesのクラスで説明しました。
https://podcasts.apple.com /私たち/ポッドキャスト/ iphoneアプリケーション・プログラミング・春-2009 / id384233222する