Encoding.Kockerbeck

2013-11-16

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
    _txtNumbers.ResignFirstResponder();
   };

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

2013-07-01

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.