2012-05-14 9 views
0

まだ、これらのデリゲートメソッドがどのように呼び出されているか完全に理解できませんでした。 私のようなtextField.delegate = self;デリゲートメソッドを呼び出す

を指定せずに、しかし、我々はwebView.delegate = self;のように入力するようになっているUIWebViewDelegateのようないくつかの異なる目的のためにそのデリゲートメソッドを呼び出します一つのクラスでUITextFieldDelegateUIViewController持っており、それは、そのデリゲートを呼び出しているように思えますメソッド。完璧。

しかし、今私は問題に直面しています。私は同じクラスのCLLocationManagerDelegateCALayerを使用しています。私は両者が競合し、一つだけのされているかの時点でlocation.delegate =self;layer.delegate =self;を与えているの両方のためにCLLocationManagerDelegateまたはCALayerのいずれかに取り組んでいます。もう1つは停止しています。なぜこういうことが起こるのではないのですか?何らかの理由?どのようにこれを克服することができます。私も、他のフレームワーク、例えばUIWebViewを使う予定でした。それらの代理メソッドについても同じ問題が発生します。なぜそれがそのように働いているのか教えていただけますか?

+0

おそらくそれらはInterface Builderで設定されているでしょうか? – Andrea

+0

いいえいいえ。代理人をコーディングのみに設定しています – Perseus

+0

[オブジェクト指向プログラムでのコミュニケーション](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html# // apple_ref/doc/uid/TP40002974-CH7-SW18)。最高のお付き合い;) –

答えて

2

デリゲートを指定せずにデリゲートを呼び出すクラスは、既定の実装を備えています。つまり、これらのメソッドをオーバーライドした場合にのみ、ビヘイビアが変更されます。

2人以上のクラスを同じデリゲートに設定しても、互いに干渉してはいけません(両方のカスタムクラスでメソッドの名前が同じであるという非常に奇妙な理由がない限り)。

あなたの問題は、それらのメソッドを実装していないか、それらのクラスを間違って使用している可能性が高いです。

たとえば、ロケーションマネージャでは、インスタンスを作成し、設定し、更新を実行する必要があります。このタイプのデリゲートの最も一般的なメソッドは、 "did update location"(またはそのようなもの)です。新しい場所を受け取るたびに通知を受けたい場合は、実装する必要があります。それ以外の場合は、必要に応じて手動で場所を読み取る必要があります。

提案として、オブジェクトの代理人を設定するたびに、object.delegate = self;を実行する必要があります。もの。そして、おそらく、そのプロトコルに準拠していることをヘッダーに指定するまで、警告が表示されることに気づいたでしょう。

UITextFieldDelegate単語をクリックするだけでコントロールできます。

@requiredのメソッドを探します。これは常に実装する必要があるためです。 @optionalはデフォルトの実装を持っていますので、実装を変更する必要はありません。

+0

はい。 location.delegate = selfを使用すると、Location Managerはデリゲートメソッドを呼び出しています。しかし、同じクラスで私はUIWebViewDelegateとwebView.delegate = selfを与えました。場合によっては、ロケーションマネージャの委任メソッドが停止することがあります。私は本当に混乱しています。 – Perseus

+0

あなたのロケーションマネージャメソッドが停止していると思われる理由は何ですか? – Pochi

+0

GPSがステータスバーに表示されているのがわかります。私のアプリケーションは、ロケーションサービスとしてバックグラウンドモードをサポートしています – Perseus

関連する問題