0

それでも、これらのデリゲート メソッドがどのように呼び出されるのか完全には理解できませんでした。私はUIViewControllerUITextFieldDelegateのように指定せずにそのデリゲートメソッドを呼び出す1つのクラスに持っていますtextField.delegate = self;

しかし、いくつかの異なる目的のために、likeUIWebViewDelegateに入るwebView.delegate = self;必要があり、そのデリゲート メソッドを呼び出しているようです。完全。

しかし今、私は問題に直面しています。私はと 同じクラスCLLocationManagerDelegateでも使用しています。CALayer私が与えlocation.delegate =self;ている両方について、layer.delegate =self;ある時点で両方が互いに競合しており、どちらか一方のみが機能していCLLocationManagerDelegateますCALayer。もう一つは、止まっています。なんでこんなことになるのかわからない?何らかの理由?どうすればこれを克服できますか。私でさえ、他のフレームワークを使用する予定でしたUIWebView。これらのデリゲート メソッドでも同じ問題に直面します。なぜそのように機能しているのか教えていただけますか?

4

1 に答える 1

2

指定せずにデリゲートを呼び出すクラスにはデフォルトの実装があります。つまり、それらはすでに何をすべきかを知っており、これらのメソッドをオーバーライドした場合にのみ動作を変更します。

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

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

たとえば、Location Managerでは、インスタンスを作成して構成し、更新の実行を開始する必要があります。このタイプのデリゲートの最も一般的な方法は、「更新場所」(またはそのようなもの)です。新しい場所を受け取るたびに通知を受け取りたい場合は、これを実装する必要があります。それ以外の場合は、必要に応じて手動で場所を読み取る必要があります。

提案として、オブジェクトのデリゲートを設定するたびに、object.delegate=self;を実行する必要があります。もの。また、ヘッダーでそのプロトコルに準拠していることを指定するまで、警告が表示されることに気付いたかもしれません。たとえば、

UITextFieldDelegateワードをクリックするだけです。

@requiredの下にあるメソッドを探してください。これらは、常に実装する必要があります。@optionalにはデフォルトの実装があるため、動作を変更したい場合を除いて、実装する必要はありません。

于 2012-05-14T07:15:15.863 に答える