2016-08-07 13 views
1

次のコードを検討してください。デリゲートに自己以外の他のクラスのインスタンスが割り当てられていることを除いて、すべてが本によって行われます。しかし、このコードは失敗します。デリゲートは決して呼び出されません。何故ですか?非自己委譲が呼び出されていない

class My: UITextField { 
    ... 
    init(...) { 
    delegate = MyDelegate() 
    } 
} 

public class MyDelegate: NSObject, UITextFieldDelegate { 
    public func textFieldDidBeginEditing(_ textField: UITextField) { 
    print("MyDelegate was called") 
    } 
} 
+0

次の行: 'public override func didLoad(){'により、 'error:メソッドはそのスーパークラスのメソッドをオーバーライドしません。 – OOPer

答えて

1

MyDelegateインスタンスが保持されません。強力な参照がなければ、間もなく割り当て解除され、呼び出しを受信するために存在しなくなります。

あなたのコード例は、典型的なデリゲートパターンから外れる:

Delegation and the Cocoa Frameworks

The delegating object is typically a framework object, and the delegate is typically a custom controller object.

テキストフィールドのビューコントローラは、一般的にテキストフィールドのデリゲートとしての地位を割り当てます:

class MyViewController: UITextFieldDelegate { 

    ... 

    func viewDidLoad() { 
     myTextField.delegate = self 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
     print("textFieldDidBeginEditing") 
    } 
} 
+1

問題を解決する方法でこの答えを広げると便利です(一般的に、 'MyDelegate()'に保持されている 'My'の強力なプロパティが必要です)。これは非常に一般的な間違いです。私は先週それを作った。それがなぜ機能していないのか理解するのに10分かかりました。 –

+1

ありがとう、それは確かに問題です。 'UITextField'内では、デリゲートは、@deneのように、他の誰かによって追加的に参照されない限り、割り当てられたものを保持しない' weak public var delegate:UITextFieldDelegate? 'として定義されています。 – j4zzcat

+0

これは役に立たない。 OPはデリゲートとして自分自身を望んでいなかったので、デリゲートコールを処理する新しいクラスが必要でした。 – robertfiorentino

0

didLoadはUITextFieldの機能ので、あなたの代理人が実際に設定されていないものではなく、それが呼び出されない理由です。プログラムでMyクラスを作成する場合は、インスタンスの作成後にデリゲートを設定できます。

let myTextField = My() 
mytextField.delegate = MyDelegate() 

あなたはクラスが作成されたデリゲート毎回設定したい場合は、のUITextFieldの初期化機能を無効にし、あなたのinit関数内デリゲートを作成する必要があります。デリゲートプロパティはweak VARを使用して定義されている場合

class MyTF : UITextField 
{ 
    override init(frame: CGRect) 
    { 
    super.init(frame: frame) 
    delegate = MyDelegate() 
    } 

    required init?(coder aDecoder: NSCoder) 
    { 
    super.init(coder: aDecoder) 
    delegate = MyDelegate() 
    }  
} 
0

あなたが作成することによって、これを達成することができますデリゲートクラスへの強力な参照をまず "let"で行い、デリゲートを設定します。さもなければ、デリゲート参照が弱いので、参照カウントはゼロであり、デリゲートなしのままになります。

let theDelegate = MyDelegate() 
delegate = theDelegate 
関連する問題