MonoTouch.Dialog: Отмена клавиатуры при касании в любом месте DialogViewController

NOTE: There are two similar SO questions (1) (2), но ни один из них не дает ответа.

TL;DR: How can one dismiss the keyboard in a MonoTouch.Dialog by letting the user touch any empty space in the view?

Я пишу приложение, используя MonoTouch.Dialog и UITabBarController. Одна из моих вкладок "Настройки" ...

Settings screen

Когда пользователь начинает печатать, клавиатура закрывает панель вкладок ...

enter image description here

Используя MonoTouch.Dialog, единственный способ отклонить клавиатуру - перейти к последнему полю и нажать кнопку «Возврат». ключ. Учитывая тот факт, что пользователь не может нажимать на любую вкладку, пока клавиатура не исчезнет, я хотел бы сделать это лучше. А именно, чтобы уволить, если пользователь нажимает в любом месте на экране.

Без MonoTouch.Dialog это совсем несложно: просто переопределить TouchesBegan и вызвать EndEditing. Но это не работает с MT.D. Я пытался создать подкласс DialogViewController и переопределить там TouchesBegan, но он не работает. Я в настоящее время в растерянности.

Или, мне интересно, мне лучше отказаться от панели вкладок, чтобы я мог использовать UINavigationController с & quot; Назад & quot; кнопка сверху, которая не будет скрыта клавиатурой?

Ответы на вопрос(4)

который не будет создавать помехи обработчикам событий TableView:

var tap = new UITapGestureRecognizer ();
tap.AddTarget (() => dvc.View.EndEditing (true));
dvc.View.AddGestureRecognizer (tap);
tap.CancelsTouchesInView = false;

Можно ли отключить клавиатуру, прикоснувшись к внешней стороне ячейки в MonoTouch.Dialog?: -)

Это мой первый запрос на функцию MonoTouch.Dialog.

Чтобы ответить на ваш вопрос: Нет. Это невозможно. Я искал и спрашивал вокруг и не нашел никаких ответов.

Я предполагаю, потому что это просто секционированная (сгруппированная) таблица, и если бы она не была секционированной, не было бы места для щелчка. Тем не менее, это только мое предположение.

Я бы хотел, чтобы Мигель или кто-то, кто работает с monotouch, ответил на это и сказал, если это вообще возможно. Возможно будущее улучшение?

то касания в соответствии с предложением (которое не мешает жестам табличного представления) - это переопределить MonoTouch.Dialog.DialogViewController.SizingSource (или MonoTouch.Dialog.DialogViewController.Source, если вы не хотите неровные строки) и передайте его DialogViewController. Я не знаю, очень ли это чисто или безопасно.

public class CustomTableViewSource : MonoTouch.Dialog.DialogViewController.SizingSource
{
 public CustomTableViewSource(MonoTouch.Dialog.DialogViewController dvc) : base(dvc)
 {

 }

 public override void DraggingStarted(UIScrollView scrollView)
 {
   base.DraggingStarted(scrollView);

   if (scrollView != null)
   {
     scrollView.EndEditing(true);
   }
 }

}

который меня вполне устраивает, поэтому я отвечаю на свой вопрос.

// I already had this code to set up the dialog view controller.
var bc = new BindingContext (this, settings, "Settings");
var dvc = new DialogViewController (bc.Root, false);

// **** ADD THIS ****
dvc.TableView.DraggingStarted += (sender, e) => {
    dvc.View.EndEditing (true);
};

Это будет отклонять клавиатуру всякий раз, когда пользователь немного перетаскивает вид. Я не смог найти связанное с табличным представлением событие касания, так что это следующая лучшая вещь. Я бы приветствовал любые другие идеи. Ура!

ВАШ ОТВЕТ НА ВОПРОС