2016-11-08 4 views
1

Ich habe eine ExtendedEntry Kontrolle, die ich verwende, um die Funktionalität meiner Entry Steuerelemente für jede Plattform zu erweitern.Überschreiben der nativen Steuerungsmethode im benutzerdefinierten Renderer

In meinem benutzerdefinierten Renderer habe ich Zugriff auf die Control-Eigenschaft, die UITextField ist. Diese Eigenschaft ermöglicht es mir, Eigenschaften des UITextField während Laufzeit zu ändern. Beispiel:

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

     Control.ClearButtonMode = UITextFieldViewMode.WhileEditing; 

     // ... 
    } 
} 

Auf iOS ich die UITextField Control bool BecomeFirstResponder Methode außer Kraft setzen möchten, die virtuell, aber ich kann nicht eine Klassenmethode wie diese zur Laufzeit außer Kraft setzen.

Wie kann ich das vom benutzerdefinierten Renderer tun?

Antwort

1

nicht sicher, was Sie tatsächlich innerhalb BecomeFirstResponder tun wollen, aber ohne eine benutzerdefinierte Unterklasse von UITextField zu erstellen, können Sie eine benutzerdefinierte UITextFieldDelegate und weisen es der UITextField.Delegate Eigenschaft erstellen.

Wenn Sie versuchen, das Feld zu verhindern, dass ein Ersthelfer werden, könnten Sie die UITextFieldDelegate.ShouldBeginEditing verwenden false zurückzukehren, diese Methode aufgerufen wird, bevor BecomeFirstResponder genannt wird) und UITextFieldDelegate.EditingStarted wird aufgerufen, nachdem BecomeFirstResponder genannt wird:

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

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

dem folgenden Link finden Sie den vollständigen Auftrag/Fluss aller Methodenaufrufe von UITextFieldDelegate Bewertung:

Ref: https://developer.apple.com/reference/uikit/uitextfielddelegate

Update:

Hier ist, wie ich die SecureTextEntry Toggle/Keine klare Feld bearbeiten tun:

1) Individuelle 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) Richten Sie Ihre UITextField:

uiTextField.Delegate = new SecureTextFieldDelegate(); 

3) Handle Touch von Umschalt- und/oder physikalischem Tastaturfeld Tabbing:

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

Die UITextField.Text jetzt sollte nie klar, wenn der Benutzer ein führt löschen

+0

Ich versuche, die UITextField überschreibt das Passwortfeld zu blockieren, wenn der Fokus wieder aufgenommen wird und ein Benutzer beginnt wieder Bearbeitung (ein Passwort Sichtbarkeit Umschaltknopf). Dies ist die Obj-C-Lösung: http://stackoverflow.com/a/37061759/1090359. Ich werde mir die von Ihnen gepostete Lösung für einen Delegierten ansehen und sehen, was ich mir vorstellen kann. – kspearrin

+0

@kspearrin Ah ... der benutzerdefinierte Delegat ist der Weg zu gehen, es sei denn, Sie arbeiten mit einem Unterklasse 'UITextField' ..., checkup mein Update – SushiHangover

+0

Ich bekomme den folgenden Fehler bekommen versuchen, den Delegaten in der Gewohnheit zu verdrahten Renderer 'OnElementChanged'' Control.Delegate = new SecureTextFieldDelegate(); '. 'System.InvalidOperationException: Die Ereignisregistrierung überschreibt den vorhandenen Delegaten. Verwenden Sie entweder nur Ereignisse oder Ihren eigenen Delegaten: ExtendedEntryRenderer + SecureTextFieldDelegate UIKit.UITextField + _UITextFieldDelegate'.Muss ich einige Standarddelegaten oder etwas zuerst abmelden? – kspearrin

Verwandte Themen