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;
 benpage10 сент. 2012 г., 08:33
Вы также должны добавить dvc.CancelsTouchesInView = false; в противном случае это отменит все остальные ваши клики на странице!
 Mike Lorenz03 июн. 2012 г., 13:42
Это блестяще. Прочитав ваш ответ на / Stackoverflow.com вопросы / 10832014 / ... Я понял, что мое решение может вызвать проблемы в будущем. Ваша система не только лучше, так как исключает такую возможность, но и обеспечивает именно ту функциональность, которую я искал. Бесконечно благодарен
 nicolas02 мая 2014 г., 12:02
если мы добавим жест касания, мы не сможем закрыть ярлык, отображаемый при предложении автозаполнения
 Chuck Pinkert14 сент. 2012 г., 01:08
add tap.CancelsTouchesInView = false; чтобы не дать TapGestureRecognizer отменить нажатие на все элементы.

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

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

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

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

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

 nicolas02 мая 2014 г., 12:03
для меня тоже. Кажется, это не сложно реализовать.
 Mike Lorenz31 мая 2012 г., 01:43
О да, я помню, что читал твой вопрос, извини. Обидно в этом вопросе: иначе MT.D - блестящий пакет. Я подожду немного на случай, если кто-то другой может получить ответ. Если нет, я приму ваше.

то касания в соответствии с предложением (которое не мешает жестам табличного представления) - это переопределить 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);
};

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

 miguel.de.icaza02 июн. 2012 г., 19:55
Выше будет мешать другим событиям TableView, используйте распознаватель жестов, как я показываю в своем ответе на этот вопрос.

Ваш ответ на вопрос