2016-11-08 3 views
1

私はコントロールの機能を各プラットフォームに拡張するために使用するコントロールをExtendedEntry持っています。カスタムレンダラーのネイティブコントロールメソッドをオーバーライド

私のカスタムレンダラーではUITextFieldControlプロパティにアクセスできます。このプロパティを使用すると、実行時にUITextFieldのプロパティを簡単に変更できます。例:iOSの上で

public class ExtendedEntryRenderer : EntryRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
    { 
     base.OnElementChanged(e); 

     Control.ClearButtonMode = UITextFieldViewMode.WhileEditing; 

     // ... 
    } 
} 

私は、しかし、私は実行時に、このようなクラスのメソッドをオーバーライドすることはできません、仮想であるUITextFieldコントロールのbool BecomeFirstResponderメソッドをオーバーライドします。

カスタムレンダラーからどうすればいいですか?

答えて

1
あなたが実際に BecomeFirstResponder以内に何をしたいのかわからない

が、UITextFieldのカスタムサブクラスを作成することなく、カスタムUITextFieldDelegateを作成することができ、それがUITextField.Delegateプロパティに割り当てます。

あなたがファーストレスポンダになってからフィールドを防ぐためにしようとしている場合、あなたは)BecomeFirstResponderが呼び出される前にこのメソッドが呼び出され、falseを返すようにUITextFieldDelegate.ShouldBeginEditingを使用することができますし、BecomeFirstResponderが呼び出された後UITextFieldDelegate.EditingStartedが呼び出されます。

public class TextFieldDelegate : UITextFieldDelegate 
{ 
    public override bool ShouldBeginEditing(UITextField textField) 
    { 
     return base.ShouldBeginEditing(textField); 
    } 

    public override void EditingStarted(UITextField textField) 
    { 
     base.EditingStarted(textField); 
    } 
} 

参考:https://developer.apple.com/reference/uikit/uitextfielddelegate

UITextFieldDelegateのすべてのメソッド呼び出しのフルオーダー/フローを確認するには次のリンクを参照してください。

更新:

1)カスタムUITextFieldDelegate

public class SecureTextFieldDelegate : UITextFieldDelegate 
{ 
    public override void EditingStarted(UITextField textField) 
    { 
     if (textField.SecureTextEntry != true) 
     { 
      var text = textField.Text; 
      textField.DeleteBackward(); 
      textField.InsertText(text); 
     } 
    } 
} 

2)セットアップあなたのUITextField:

uiTextField.Delegate = new SecureTextFieldDelegate(); 
ここ

は、私が編集にSecureTextEntryトグル/明確なフィールドを行わない方法です

3)ハンドルトグルまたは物理キーボードのフィールドのタッチタブ:

uiSwitch.ValueChanged += (object sender, EventArgs e) => 
{ 
    uiTextField.SecureTextEntry = !uiTextField.SecureTextEntry; 
    if (uiTextField.SecureTextEntry == true) 
    { 
     var text = uiTextField.Text; 
     uiTextField.DeleteBackward(); 
     uiTextField.InsertText(text); 
    } 
}; 

UITextField.Text今、ユーザーが実行しない限り、決して明確な私はフォーカスが再開されるパスワードフィールドを上書きするUITextFieldを阻止しようとしています

+0

削除し、ユーザーはパスワードの可視性のために(再編集を開始すべきですトグルボタン)。これはObj-Cソリューションです:http://stackoverflow.com/a/37061759/1090359。あなたが投稿したデリゲートソリューションを見て、私が思いつくことができるものを見てみましょう。 – kspearrin

+0

@kspearrinああ...カスタムデリゲートは、サブクラス化された 'UITextField'を使って作業していない限り行く方法です...、checkout私の更新 – SushiHangover

+0

カスタムでデリゲートを結びつけようとすると次のエラーが発生しているようですレンダラー 'OnElementChanged'' Control.Delegate = new SecureTextFieldDelegate(); '。 'System.InvalidOperationException:イベント登録が既存のデリゲートを上書きしています。単に、イベントや独自のデリゲートを使用してください:ExtendedEntryRenderer + SecureTextFieldDelegate UIKit.UITextField + _UITextFieldDelegate'。既定のデリゲートなどを最初に登録解除する必要がありますか? – kspearrin

関連する問題