2012-05-30 12 views
16

UWAGA: Istnieją dwa podobne pytania SO (1)(2), ale żadna z nich nie daje odpowiedź.MonoTouch.Dialog: Lekceważenie klawiaturę, dotykając dowolnego miejsca w DialogViewController

TL; DR: Jak można odłączyć klawiaturę w MonoTouch.Dialog, pozwalając użytkownikowi dotknąć pustego miejsca w widoku?

Piszę aplikację przy użyciu MonoTouch.Dialog i UITabBarController. Jeden z moich kartach jest "Ustawienia" ...

Settings screen

Gdy użytkownik zaczyna wpisywać klawiatura utrudnia umieszczenie zakładek ...

enter image description here

Korzystanie MonoTouch.Dialog, jedynym sposobem na zamknięcie klawiatury jest przejście do ostatniego pola i naciśnięcie klawisza "return". Biorąc pod uwagę fakt, że użytkownik nie może nacisnąć żadnej karty, dopóki klawiatura nie zniknie, chciałbym to zrobić lepiej. Mianowicie, aby odrzucić, jeśli użytkownik dotknie nigdzie indziej na ekranie.

Bez MonoTouch.Dialog, jest to bardzo proste: wystarczy zastąpić TouchesBegan i wywołać EndEditing. Ale to nie działa z MT.D. Próbowałem już podklasowania DialogViewController i nadpisałem tam TouchBegan, ale to nie działa. Obecnie jestem na straconej pozycji.

A może zastanawiam się, czy lepiej będzie, gdy opuszczę zakładkę, aby można było użyć przycisku UINavigationController z przyciskiem "Back" na górze, który nie będzie ukryty za klawiaturą?

Odpowiedz

30

Proponuję użyć rozpoznawania gestów kranu że nie spowoduje zakłóceń z obsługi zdarzeń Tableview:

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

To jest genialne. Po przeczytaniu odpowiedzi na http://stackoverflow.com/questions/10832014/using-delelerationended-interferes-with-other-callbacks zdałem sobie sprawę, że moje rozwiązanie może spowodować problem na drodze. Nie tylko twój jest lepszy, ponieważ eliminuje taką możliwość, zapewnia również dokładnie taką funkcję, jakiej szukałem. Stukrotne dzięki! –

+3

należy również dodać dvc.CancelsTouchesInView = false; w przeciwnym razie spowoduje to anulowanie wszystkich innych kliknięć na stronie! – benpage

+13

dodaj tap.CancelsTouchesInView = false; aby zapobiec anulowaniu kliknięcia wszystkich elementów przez narzędzie TapGestureRecognizer. –

2

Przegapiłeś moje pytanie o tym również: Can the keyboard be dismissed by touching outside of the cell in MonoTouch.Dialog? :-)

To jest mój # 1 cecha zapytanie MonoTouch.Dialog.

Aby odpowiedzieć na pytanie: Nie. Nie jest to możliwe. Szukałem, pytałem i nie znalazłem żadnych odpowiedzi.

Zakładam, ponieważ jest to tylko podzielona na części (zgrupowane) tabela, a jeśli nie została podzielona, ​​nie byłoby miejsca do kliknięcia. Jednak to tylko moja spekulacja.

Chciałbym, żeby miguel lub ktoś, kto pracuje na monotourze, odpowiedziałby na to i powiedziałby, czy to nawet możliwe. Prawdopodobnie przyszłe ulepszenie?

+0

O tak, pamiętam czytania pytanie, przepraszam. Szkoda w tej kwestii: w przeciwnym razie MT.D jest genialnym pakietem. Zaczekam na chwilę na wypadek, gdyby ktoś inny mógł znaleźć odpowiedź. Jeśli nie, przyjmuję twoje. –

+0

także dla mnie. Nie wydaje się trudne do wdrożenia. – nicolas

1

Wymyśliłem obejście, które wystarczająco mnie satysfakcjonuje, więc odpowiadam na własne pytanie.

// 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); 
}; 

Spowoduje to zamknięcie klawiatury za każdym razem, gdy użytkownik trochę przeciągnie widok. Nie ma wydarzenia dotykowego, które mogłem znaleźć w widoku tabeli, więc jest to kolejna najlepsza rzecz. Z zadowoleniem przyjmuję wszelkie inne pomysły. Twoje zdrowie!

+1

Powyższe zakłóci inne zdarzenia TableView, użyj narzędzia do rozpoznawania gestów, co pokazałem w odpowiedzi na to pytanie. –

0

Jeden obejście korzystania z gestu przeciągania zamiast kranu jak zaproponowano (które nie kolidują z Gesty widoku tabeli) ma zastąpić MonoTouch.Dialog.DialogViewController.SizingSource (lub MonoTouch.Dialog.DialogViewController.Source, jeśli nie chcesz, aby nierówne wiersze) i daj go do DialogViewController. Nie wiem, czy to jest bardzo czyste czy bezpieczne.

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); 
    } 
} 

}