Czy istnieje sposób, aby wykryć naciśnięcie klawisza Backspace/ Deletena klawiaturze iPhone'a na UITextField
pustej klawiaturze ? Chcę wiedzieć, kiedyBackspace jest wciśnięty, tylko jeśli UITextField
jest pusty.
Bazując na sugestii @Alex Reynolds w komentarzu, podczas tworzenia mojego pola tekstowego dodałem następujący kod:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:searchTextField];
To powiadomienie jest odbierane ( handleTextFieldChanged
wywoływana jest funkcja), ale nadal nie po naciśnięciu Backspaceklawisza w pustym polu. Jakieś pomysły?
Wydaje się, że jest pewne zamieszanie wokół tego pytania. Chcę otrzymać powiadomienie o Backspacenaciśnięciu klawisza. Otóż to. Ale rozwiązanie musi również działać, gdy UITextField
jest już puste.
ios
iphone
uitextfield
backspace
marcc
źródło
źródło
Odpowiedzi:
To może być długa szansa, ale może zadziałać. Spróbuj ustawić tekst w polu tekstowym na znak spacji o zerowej szerokości
\u200B
. Naciśnięcie klawisza Backspace w polu tekstowym, które wydaje się puste, w rzeczywistości spowoduje usunięcie spacji. Następnie możesz po prostu ponownie włożyć spację.Może nie działać, jeśli użytkownikowi uda się przesunąć karetkę na lewo od pomieszczenia.
źródło
UITextField
i wdrożeniecanPerformAction:withSender:
doreturn NO
zaselect:
iselectAll:
działań, gdy tekst jest równy ciąg@"\u200B"
.Swift 4:
Podklasa
UITextField
:Realizacja:
Cel C:
Podklasa
UITextField
:Teraz po prostu dodaj MyTextFieldDelegate do swojego
UIViewController
i ustawUITextFields
myDelegate naself
:źródło
ViewController
klasie, jeśliUITextField
UIViewController
deleteBackward()
nie zostanie wywołana, jeśli wasreturn false
wtextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
Aktualizacja: Zobacz odpowiedź JacobCaraballo, aby zapoznać się z przykładem, który zastępuje
-[UITextField deleteBackward]
.Wyewidencjonuj
UITextInput
, w szczególnościUIKeyInput
madeleteBackward
metodę delegata, która jest zawsze wywoływana po naciśnięciu klawisza Delete. Jeśli robisz coś prostego, możesz rozważyć po prostu podklasęUILabel
i dostosowanie jej doUIKeyInput
protokołu, jak to zrobiono w SimpleTextInput i tym przykładzie UIKeyInput dla iPhone'a . Uwaga:UITextInput
i jego krewni (w tymUIKeyInput
) są dostępni tylko w iOS 3.2 i nowszych.źródło
Kod jak następujący:
W końcu zapomnij zmienić właściwość klasy niestandardowej pola tekstowego na „MyTextField”
źródło
Szybka realizacja:
źródło
Znalazłem inny sposób łatwiejszy niż
subclass
rozwiązanie. Nawet trochę dziwne, ale działa dobrze.To trochę dziwne, ponieważ wynik porównania to -8. Może w pewnym momencie się mylę
C Programming
. Ale to dobra robota;)źródło
strcmp
zwrotach-1, 0, or 1
? To było moje zrozumienie.UITextViewDelegate
metoda, nieUITextFieldDelegate
.Spróbuj
delegate
Następnie sprawdź, czy to
range.length == 1
wydaje się mieć miejsce w przypadkubackspace
trafienia.źródło
użyj poniższego kodu, który pomoże ci wykryć klawisz usuwania klawiatury, nawet jeśli pole tekstowe jest puste.
Cel C :
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }
Szybki:
źródło
Odpowiedź Niklasa Alvaeusa pomogła mi w podobnym problemie
Ograniczałem wejście do określonego zestawu znaków, ale ignorowałem spacje. Więc musiałem to sprawdzić
range.length == 1
przed przycięciemNSString
. Jeśli to prawda, po prostu zwracam ciąg i nie przycinam go. Zobacz poniżejźródło
Dla tych, którzy mają problemy z odpowiedzią Jacoba, zaimplementowałem moją podklasę textfield w następujący sposób i działa świetnie!
źródło
Tak, użyj poniższej metody, aby wykryć klawisz Backspace, gdy pole textField jest puste.
Musisz dodać UITextFieldDelegate
yourTextField.delegate = self (MUSI WYMAGANE)
Szybki:
Cel C:
źródło
Najlepszym zastosowaniem, jakie znalazłem do wykrywania cofania, jest wykrywanie, kiedy użytkownik nacisnął klawisz Backspace w pustym miejscu
UITextField
. Na przykład, jeśli masz „bąbelkowanych” odbiorców w aplikacji pocztowej, po naciśnięciu klawisza Backspace w elemencieUITextField
, wybierany jest ostatni „bąbelkowany” odbiorca.Można to zrobić w podobny sposób jak odpowiedź Jacoba Caraballo. Ale w odpowiedzi Jacoba, jeśli po
UITextField
naciśnięciu klawisza Backspace pozostał jeden znak, do czasu odebrania wiadomości delegataUITextField
testament będzie już pusty, więc skutecznie wykrywaszbackspace
pole tekstowe zawierające co najwyżej jeden znak.Właściwie, jeśli chcesz wykryć
backspace
na aUITextField
z dokładnie zerowymi znakami (pustymi), powinieneś wysłać wiadomość dodelegate
przed wywołaniemsuper deleteBackward
. Na przykład:Interfejs dla takiego pola tekstowego wyglądałby mniej więcej tak:
źródło
W systemie iOS 6 metoda deleteBackward jest wywoływana w UITextField po naciśnięciu klawisza Backspace, w tym gdy pole jest puste. Możesz więc utworzyć podklasę UITextField i zapewnić własną implementację deleteBackward (również wywołując super).
Jednak nadal obsługuję iOS 5, więc potrzebuję kombinacji odpowiedzi Andrew i tego.
źródło
:) tylko dla tytułu „Detect backspace”, gdzie używam
UIKeyboardTypeNumberPad
.Dziś wieczorem spotykam się z tym samym pytaniem, a poniżej znajduje się mój kod, aby to sprawdzić:
Ponieważ z
UIKeyboardTypeNumberPad
, użytkownik może wprowadzić tylko liczbę lub cofnięcie, więc gdy długość łańcucha wynosi 0, musi to być klawisz Backspace.Mam nadzieję, że powyższe pomoże.
źródło
Zamiast próbować wstępnie konstruować, co BĘDZIE w polu tekstowym lub dowiedzieć się, jaki znak specjalny został wprowadzony w
shouldChangeCharactersInRange
metodzie, sugerowałbym wykonanie następujących czynności:Pozwala to na wywołanie metody bezpośrednio po zakończeniu bieżącej operacji. Fajne w tym jest to, że po zakończeniu zmodyfikowana wartość będzie już znajdować się w
UITextField
. W tym momencie możesz po prostu sprawdzić jego długość i / lub zweryfikować na podstawie tego, co tam jest.źródło
Podklasa UITextField nie działała dla mnie w iOS 8.3, metoda deleteBackward nigdy nie została wywołana.
Oto rozwiązanie, z którego korzystałem, działa na wszystkich wersjach iOS 8 i powinno działać również na innych wersjach iOS
źródło
W pliku .h dodaj delegata UIKeyInput
ulepszone formatowanie
źródło
Zaimplementowałem podobne rozwiązanie z niewielkimi ulepszeniami, które powiedzą mi, że jeśli pole tekstowe ma jakąkolwiek wartość, gdy użytkownik naciska klawisz Backspace. Jest to przydatne w moim przypadku, gdy powinienem skupić się na innym polu tekstowym tylko wtedy, gdy pole tekstowe jest puste po naciśnięciu klawisza Backspace.
źródło
W najpopularniejszej odpowiedzi brakuje jednej rzeczy - możliwości wykrycia, czy pole tekstowe było puste, czy nie.
Oznacza to, że po zastąpieniu metody deleteBackwards () podklasy TextField nadal nie wiadomo, czy pole tekstowe było już puste. (Zarówno przed, jak i po funkcji deleteBackwards ()
textField.text!
jest pustym ciągiem:""
)Oto moja poprawa, ze sprawdzeniem pustki przed usunięciem.
1. Utwórz protokół delegata rozszerzający UITextFieldDelegate
2. Podklasa UITextField
3. Zaimplementuj nowy protokół delegata
źródło
Kompleksowy program obsługi dla pola tekstowego z jednocyfrowym numerem dla Swift 5.1 :
1 krok
2 krok
3 krok
źródło
Oto moje rozwiązanie oparte na pomyśle @andrew:
gdzieś, na przykład w viewDidLoad
i wtedy
źródło
Możesz sprawdzić tekst widoku / pola tekstu, aby zobaczyć, czy jest pusty i upewnić się, że tekst zastępczy jest również pusty w metodzie delegata shouldChangeTextIn.
źródło
Coś takiego:
oczywiście hash dotyczy jednego ciągu znaków.
źródło
Korzystanie z metody delegata TextField:
Dodaj następujący kod w powyższej metodzie, aby wykryć zdarzenie usunięcia
źródło
Aby zachować prostotę, jest to jedyny warunek, który musisz sprawdzić
źródło
źródło
W
UITextViewDelegate
:dla mnie działa dobrze.
aktualizacja dla chińskiego uproszczonego pinyin i chińskiego pisma odręcznego:
na podstawie dokumentu mówi:
„Jeśli użytkownik naciśnie klawisz
deleteKey
, długość zakresu wynosi 1, a pusty obiekt łańcuchowy zastępuje ten pojedynczy znak”.źródło
UITextField
, nieUITextView
.