2016-11-08 81 views
1

我有一個ExtendedEntry控件,我使用它來擴展每個平臺的控件的功能Entry在自定義渲染器中覆蓋原生控制方法

在我的自定義渲染器中,我可以訪問Control屬性,它是UITextField。該屬性允許我在運行時輕鬆更改UITextField的屬性。例如:

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

     Control.ClearButtonMode = UITextFieldViewMode.WhileEditing; 

     // ... 
    } 
} 

在iOS我想覆蓋UITextField控制的bool BecomeFirstResponder方法,它是虛擬的,然而,我無法在運行時覆蓋一類方法是這樣的。

如何從自定義渲染器執行此操作?

回答

1

不知道你真正想要從BecomeFirstResponder做什麼,而是沒有創造UITextField自定義子類,您可以創建自定義UITextFieldDelegate,並將其分配給UITextField.Delegate財產。

如果你想防止成爲第一個響應的現場,你可以使用UITextFieldDelegate.ShouldBeginEditing返回falseBecomeFirstResponder調用之前調用此方法)和UITextFieldDelegate.EditingStartedBecomeFirstResponder後稱爲被稱爲:

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

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

請參考以下鏈接查看的UITextFieldDelegate的所有方法調用的完整的訂單/流程:

編號:https://developer.apple.com/reference/uikit/uitextfielddelegate

更新:

這裏是我做編輯SecureTextEntry切換/沒有明確的領域:

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(); 

3)手柄觸摸切換和/或物理鍵盤字段Tabbing:

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現在應該,除非用戶執行從未明確一個刪除

+0

我試圖從覆蓋焦時恢復密碼字段阻擋的UITextField和用戶開始重新編輯(密碼知名度切換按鈕)。這是Obj-C解決方案:http://stackoverflow.com/a/37061759/1090359。我會看看你發佈的代表解決方案,看看我能想出什麼。 – kspearrin

+0

@kspearrin啊...自定義委託是要走的路,除非你正在使用分類的'UITextField' ...,結帳我的更新 – SushiHangover

+0

我似乎在嘗試連接自定義委託時出現以下錯誤渲染器OnElementChanged'' Control.Delegate = new SecureTextFieldDelegate();'。 'System.InvalidOperationException:事件註冊覆蓋現有的委託。無論是使用事件還是您自己的委託:ExtendedEntryRenderer + SecureTextFieldDelegate UIKit.UITextField + _UITextFieldDelegate'。我是否需要首先取消註冊某個默認代理或某個東西? – kspearrin