2016-09-16 1 views
1

Nachdem ich die numerische Tastatur Done button on iOS in Xamarin Forms hinzugefügt habe, stieß ich auf ein anderes Problem: die Schaltfläche "Fertig" löst kein abgeschlossenes Ereignis aus (wie Return-Schaltfläche). Auf meinem Weg, dies zu realisieren, fand ich den folgenden Code auf Xamarin Forums:Erledigt-Schaltfläche nicht ausgelöst Erledigt-Ereignis auf Xamarin-Eintrag

using System; 
using System.Drawing; 
using System.Reflection; 
using Xamarin.Forms.Platform.iOS; 
using Xamarin.Forms; 
using UIKit; 
using KeyboardTest.iOS; 
using KeyboardTest; 

[assembly: ExportRenderer(typeof(EntryDone), typeof(EntryDoneRenderer))] 

namespace KeyboardTest.iOS 
{ 
public class EntryDoneRenderer : EntryRenderer 
{ 
// used to cache the MethodInfo so we only have the reflection hit once 
private MethodInfo baseEntrySendCompleted = null; 
public EntryDoneRenderer() 
{ 
} 

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
{ 
    base.OnElementChanged (e); 

    if (this.Element.Keyboard == Keyboard.Numeric) 
    { 
     // only want the Done on the numeric keyboard type 
     UIToolbar toolbar = new UIToolbar (new RectangleF (0.0f, 0.0f, (float)Control.Frame.Size.Width, 44.0f)); 

     var doneButton = new UIBarButtonItem (UIBarButtonSystemItem.Done, delegate { 
      this.Control.ResignFirstResponder(); 
      Type baseEntry = this.Element.GetType(); 
      if(baseEntrySendCompleted==null) 
      { 
       // use reflection to find our method 
       baseEntrySendCompleted = baseEntry.GetMethod("SendCompleted",BindingFlags.NonPublic|BindingFlags.Instance); 
      } 

      try 
      { 
       baseEntrySendCompleted.Invoke(this.Element,null); 
      } 
      catch (Exception ex) 
      { 
       // handle the invoke error condition  
      } 

     }); 

     toolbar.Items = new UIBarButtonItem[] { 
      new UIBarButtonItem (UIBarButtonSystemItem.FlexibleSpace), 
      doneButton 
     }; 

     this.Control.InputAccessoryView = toolbar; 
    } 
} 
} 
} 

Ich weiß nicht, warum, aber ich erhalte die Fehlermeldung:

System.NullReferenceException: Object reference not set to an instance of an object 
    at myGame.iOS.DoneEntryRenderer.<OnElementChanged>m__0 (System.Object , System.EventArgs) [0x0005d] in /Users/silviu/Projects/myGame/iOS/DoneEntry.cs:37 

Auf dieser Linie habe ich den Code : baseEntrySendCompleted.Invoke(this.Element, null);

ich habe versucht, das Problem zu debuggen, und ich fand, dass die SendCompleted Methode existiert nicht, aber ich verstehe nicht, wie in der neuesten Version von Xamarin, dieses Problem zu lösen becaus e Ich denke an den Moment, als der Typ den Code gepostet hat, hat funktioniert.

Danke!

+0

Das sieht für mich wie ein kompletter Hack aus ... wie auch immer, Sie könnten versuchen, das 'Completed' -Ereignis direkt aufzurufen, anstatt Reflektionen zu verwenden. Es ist öffentlich erklärt: https://github.com/xamarin/Xamarin.Forms/blob/5e553f6195e66e48688b8ab324f1bab1e9251f0a/Xamarin.Forms.Core/Entry.cs#L96 – Krumelur

Antwort

1

SendCompleted() wurde tatsächlich für IEntryController hinzugefügt, so dass Sie keine Reflektion dafür mehr verwenden müssen. Tatsächlich scheint es so, dass es nicht mehr funktioniert. Rufen Sie einfach SendCompleted() direkt von Ihrem Knopf aus drücken Sie so.

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
    { 
     base.OnElementChanged(e); 

     var toolbar = new UIToolbar(new CGRect(0.0f, 0.0f, Control.Frame.Size.Width, 44.0f)); 

     toolbar.Items = new[] 
     { 
      new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), 
      new UIBarButtonItem(UIBarButtonSystemItem.Done, delegate { 
       Control.ResignFirstResponder(); 
       ((IEntryController)Element).SendCompleted(); 
      }) 
     }; 

     this.Control.InputAccessoryView = toolbar; 
    } 
+1

Vielen Dank! Es funktioniert super! :) – Silviu