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!
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