Done button on iOS NumberPad with Xamarin

There are a ton of potential solutions on the Internet for adding a Done button to a NumberPad-type of UITextField on iOS.  Unfortunately most of them are old, use custom images or even require iterating through sub views to find the target keyboard.

Below is a solution -- using Xamarin -- to add a Done button without fear of index-out-of-bound exceptions or using out-dated custom images. The trick is using the WeakInputDelegate of the UITextField & adding a custom button to that.
A full working project is available on github.

  public override void ViewDidLoad ()
   base.ViewDidLoad ();

   // Your stuff

   NSNotificationCenter.DefaultCenter.AddObserver ("UIKeyboardWillShowNotification", KeyboardWillShow);

  public void KeyboardWillShow(NSNotification notification)
   var doneButton = new UIButton (UIButtonType.Custom);
   doneButton.Frame = new RectangleF (0, 163, 106, 53);
   doneButton.SetTitle ("DONE", UIControlState.Normal);
   doneButton.SetTitleColor (UIColor.Black, UIControlState.Normal);
   doneButton.SetTitleColor (UIColor.White, UIControlState.Highlighted);

   doneButton.TouchUpInside += (sender, e) => 
    // Make the Done button do its thing!  The textfield shouldn't be the first responder

   // This is the 'magic' that could change with future version of iOS
   var keyboard = _txtNumbers.WeakInputDelegate as UIView;
   if (keyboard != null)
    keyboard.AddSubview (doneButton);

EDIT 2013-11-18: Bug Fix

I modified the example on github to have another UITextField and to hide the done button whenever another keyboard is visible


Xamarin .xib Tree Hierarchy Cleanup

Another annoyance with Xamarin Studio is when adding a new iPhone View Controller and the csproj's hierarchy is different than what you'd expect (or what is used in the mobile-samples).

So I whipped up another Python script to save me some time & appease my obsessiveness.

Let's add a new iPhone View Controller simply called "MainMenu"...

Notice how the tree hierarchy has the .designer.cs file nested underneath the controller .cs file -- and the .xib file is completely independent.

And when we head back over to Xamarin Studio, it will automatically reload the project file & our tree hierarchy will be clean again.