2017-10-30 12 views
1

私はSequencedTextFieldsプロトコルを持っています。このプロトコルには一連のテキストフィールドが含まれています。ユーザがキーボードのReturnボタンをタップすると、現在のテキストフィールドは最初のレスポンダを辞退し、シーケンス内の次のテキストフィールドが最初のレスポンダになるはずです。そして、それは私がビューコントローラのUITextFieldDelegateプロトコルの直接の実装を使用していたときに、良い作品:私はdefault実装を使用しようとしているとき、UITextFieldDelegate拡張関数がトリガしません、なぜですか?

extension MyViewController: UITextFieldDelegate { 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     nextInSequence(after: textField)?.becomeFirstResponder() 
     return true 
    } 
} 

をしかし、それは今までトリガーしません:

extension UITextFieldDelegate where Self: SequencedTextFields { 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     nextInSequence(after: textField)?.becomeFirstResponder() 
     return true 
    } 
} 

何が原因でしょうか?または私は何かを逃したのですか?

UPDATE:

私のビューコントローラ定義:

final class MyViewController: UIViewController, UITextFieldDelegate, SequencedTextFields 

は、テキストフィールドのデリゲートを設定: enter image description here

+0

あなたは適切にデリゲートを設定していますか? – Nullify

+0

@Nullifyはい、コードの最初の例を使用しているときに動作します –

+0

自分にテキストフィールド代理人を設定する場所を教えてください。あなたのtextfield.delegate = selfを? SequencedTextFields – Nullify

答えて

1

あなたがしようとしているので、あなたの実装が動作していない理由は、クラスの代わりにインターフェイス(UITextFieldDelegate)を拡張するため、代わりにUIViewControllerを使用すると動作します。

可能なことはSequencedTextFieldUITextFieldに拡張されたカスタムクラスを作成することです。私はあなたのSequencedTextFieldsプロトコルを実装するクラスを表すsequencedDelegateと呼ばれていること(カスタムデリゲートを追加します。

は、あなたのデフォルトの実装でUITextFieldDelegateを実装するためにSequencedTextFieldを拡張します。

MyViewControllerで、viewControllerであなたのSequencedTextFieldデリゲートを設定。自身

終わりに、それは次のようになります。

protocol SequencedTextFields: class { 
    func nextInSequence(after: UITextField) -> UITextField? 
} 

class SequencedTextField: UITextField { 
    weak var sequencedDelegate: SequencedTextFields? 
} 

extension SequencedTextField: UITextFieldDelegate { 
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     sequencedDelegate?.nextInSequence(after: textField)?.becomeFirstResponder() 
     return true 
    } 
} 

class MyViewController : UIViewController, SequencedTextFields { 
    var textField = SequencedTextField() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textField.delegate = textField 
     textField.sequencedDelegate = self 
    } 

    func nextInSequence(after: UITextField) -> UITextField? { 
     // your view controllers nextInSequence implementation here 
    } 
} 
+0

運がない、動作しません。 –

+0

更新された回答! – jvrmed

+0

'UITextFieldDelegate'は公開プロトコルです。スイフトはプロトコルを拡張することができるので、動作しないというのは変です。例えば、私は "Self:UIViewControllerどこで拡張子SequencedTextFields"( "func nextInSequence(textField:UITextFieldの後) - > UITextField?")を期待どおりに動作させます。 –

0

コードに問題がありますか?

最初の拡張子は、ビューコントローラMyViewControllerの拡張です。そのため、それが機能しています。しかし、2番目はUITextFieldDelegateの拡張です。それらは完全に2つの異なるものです。

達成したいことが明確ではありません。

これは、あなたがこのように行うことができますあなたの特別なUITextFieldのための1 CustomProtocolを作りたい場合は、カスタムプロトコル

を使用する方法です。あなたのデリゲートメソッドを実装するデリゲート

self.textField.delegate = self 
  • のViewController拡張に設定したプロトコル

    protocol SequencedTextFields: UITextFieldDelegate { 
        func checkSomeThing(_ textField: UITextField) -> Bool 
    } 
    
  • Declear CustomTextFieldProtocol

    • extension ViewController: SequencedTextFields { 
      
          func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
           textField.resignFirstResponder() 
           nextInSequence(after: textField)?.becomeFirstResponder() 
           return true 
          } 
      
          func checkSomeThing(_ textField: UITextField) -> Bool { 
           print("Check here") 
           return true 
          } 
      } 
      
  • 関連する問題