MonoTouch.Dialog: Отключение клавиатуры, касаясь в любом месте DialogViewController
ПРИМЕЧАНИЕ. Есть два похожих вопроса SO (1) (2), но ни один из них не дает ответа.
TL; DR: Как можно отбросить клавиатуру в MonoTouch.Dialog, позволяя пользователю коснуться любого пустого пространства в представлении?
Я пишу приложение, используя MonoTouch.Dialog и UITabBarController. Одна из моих вкладок - "Настройки"...
![Settings screen]()
Когда пользователь начинает печатать, клавиатура препятствует табуляции...
![enter image description here]()
Используя MonoTouch.Dialog, единственный способ отклонить клавиатуру - перейти в последнее поле и нажать клавишу "возврат". Учитывая тот факт, что пользователь не может нажать любую вкладку до тех пор, пока клавиатура не исчезнет, я бы хотел, чтобы это было лучше. А именно: отклонить, если пользователь нажимает на другое место на экране.
Без MonoTouch.Dialog это легко: просто переопределите TouchesBegan и вызовите EndEditing. Но это не работает с MT.D. Я пробовал подклассифицировать DialogViewController и переопределять TouchesBegan там, но он не работает. Я сейчас в растерянности.
Или, мне интересно, лучше ли мне помещать вкладку, чтобы я мог использовать UINavigationController с кнопкой "Назад" сверху, которая не будет скрыта клавиатурой?
Ответы
Ответ 1
Я предлагаю вам использовать распознаватель жестов, который не будет создавать помехи обработчикам событий TableView:
var tap = new UITapGestureRecognizer ();
tap.AddTarget (() => dvc.View.EndEditing (true));
dvc.View.AddGestureRecognizer (tap);
tap.CancelsTouchesInView = false;
Ответ 2
Вы также пропустили мой вопрос: Можно ли отклонить клавиатуру, коснувшись внешней ячейки в MonoTouch.Dialog?
: -)
Это мой # 1 запрос функции для MonoTouch.Dialog.
Чтобы ответить на ваш вопрос: Нет. Это невозможно. Я искал и спросил и не нашел ответов.
Я предполагаю, что это всего лишь разделенная (сгруппированная) таблица, и если она не была разделена на разделы, не было бы места для клика. Однако это только мои предположения.
Я хочу, чтобы miguel или кто-то, кто работает над monotouch, ответил бы на это и сказал, если это возможно. Возможно, будущее улучшение?
Ответ 3
Я выяснил обходное решение, которое удовлетворяет меня достаточно хорошо, поэтому я отвечаю на свой вопрос.
// 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);
};
Это отклонит клавиатуру всякий раз, когда пользователь немного перетаскивает представление. Там нет события касания, которое я мог бы найти связанным с табличным представлением, так что это следующая лучшая вещь. Я бы приветствовал любые другие идеи. Ура!
Ответ 4
Один способ обхода жестов перетаскивания вместо того, чтобы предлагать (который не мешает жесту табличного вида), - это переопределить MonoTouch.Dialog.DialogViewController.SizeSource(или MonoTouch.Dialog.DialogViewController.Source, если вы наняли, t хотите неровные строки) и передать его в 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);
}
}
}