2017-05-22 3 views
2

Ich benutze benutzerdefinierte UITextView und muss Tastatur bei Klick auf die Schaltfläche ausblenden. Ich muss 'ShouldChangeTextInRange' fangen, was Textview hat, ich weiß nicht warum, aber Methode wird nicht aufgerufen. hier ist der Code der für meine Textansicht:ShouldChangeTextInRange wird nicht für UITextView aufgerufen

 public class PlaceholderTextView : UITextView 
     { 
public PlaceholderTextView() 
     { 
      Initialize(); 
     } 

     public PlaceholderTextView (CGRect frame) 
      : base (frame) 
     { 
      Initialize(); 
     } 

     public PlaceholderTextView (IntPtr handle) 
      : base (handle) 
     { 
      Initialize(); 
     } 

     void Initialize() 
     { 
      Text = Placeholder; 

      ShouldBeginEditing = t => { 
       if (Text == Placeholder) 
        Text = string.Empty; 

       return true; 
      }; 

      ShouldEndEditing = t => { 
       if (string.IsNullOrEmpty (Text)) 
        Text = Placeholder; 
       return true; 
      }; 

     } 
     public override bool ShouldChangeTextInRange (UITextRange inRange, string replacementText) 
       { 
        if (Text.Equals ("\n")) { 
         this.EndEditing (true); 
         return false; 
        } else { 
         return true; 
        } 
       } 
     } 
+0

Hätten Sie textviewDelegate self in viewDidLoad ?? –

+0

Ich habe versucht, (Delegate = this) in Initialize-Methoden hinzuzufügen, aber throws invocationtargetexception – Nininea

+0

addieren Sie viewdidload: textViewObject.delegate = self –

Antwort

1

In Ihrem UITextView Unterklasse, IUITextViewDelegate hinzufügen und ShouldChangeText (Selector textView:shouldChangeTextInRange:replacementText:) implementieren:

public class MyTextView : UITextView, IUITextViewDelegate 
{ 
    string Placeholder; 

    public MyTextView() 
    { 
     Initialize(); 
    } 

    public MyTextView(Foundation.NSCoder coder) : base(coder) 
    { 
     Initialize(); 
    } 

    public MyTextView(Foundation.NSObjectFlag t) : base(t) 
    { 
     Initialize(); 
    } 

    public MyTextView(IntPtr handle) : base(handle) 
    { 
     Initialize(); 
    } 

    public MyTextView(CoreGraphics.CGRect frame) : base(frame) 
    { 
     Initialize(); 
    } 

    public MyTextView(CoreGraphics.CGRect frame, NSTextContainer textContainer) : base(frame, textContainer) 
    { 
     Initialize(); 
    } 

    void Initialize() 
    { 
     Delegate = this; 
    } 

    [Export("textViewShouldBeginEditing:")] 
    public bool ShouldBeginEditing(UITextView textView) 
    { 
     if (Text == Placeholder) 
      Text = string.Empty; 

     return true; 
    } 

    [Export("textViewShouldEndEditing:")] 
    public bool ShouldEndEditing(UITextView textView) 
    { 
     if (string.IsNullOrEmpty(Text)) 
      Text = Placeholder; 
     return true; 
    } 

    [Export("textView:shouldChangeTextInRange:replacementText:")] 
    public bool ShouldChangeText(UITextView textView, NSRange range, string text) 
    { 
     if (text.Contains("\n")) 
     { 
      this.EndEditing(true); 
      return false; 
     } 
     return true; 
    } 
} 

Hinweis: Sie können nicht mischen ObjC/Swift-Stil mit Delegaten und C# anonyme Delegaten, andernfalls wird der Fehler angezeigt:

Event registration is overwriting existing delegate. Either just use events or your own delegate

+0

Ich habe dies versucht, aber folgende Ausnahme ausgelöst: System.Reflection.TargetInvocationException: Ausnahme wurde durch das Ziel eines Aufrufs ausgelöst. ---> System.InvalidOperationException: Ereignisregistrierung überschreibt vorhandenen Delegaten. Verwenden Sie entweder nur Ereignisse oder Ihren eigenen Delegaten – Nininea

+0

@Nininea Welche C# -basierten Ereignisse weisen Sie diesem 'UItextView' zu? – SushiHangover

+0

Ich habe die Frage aktualisiert – Nininea

Verwandte Themen