W bibliotece IB wstęp mówi nam, że po returnnaciśnięciu klawisza klawiatura do UITextView
zniknie. Ale tak naprawdę returnklucz może działać tylko jako „\ n”.
Mogę dodać przycisk i użyć [txtView resignFirstResponder]
do ukrycia klawiatury.
Ale czy istnieje sposób, aby dodać akcję dla returnklawisza na klawiaturze, aby nie trzeba było dodawać UIButton
?
iphone
objective-c
keyboard
uitextview
iphone-softkeyboard
Chilly Zhong
źródło
źródło
Odpowiedzi:
UITextView
nie ma żadnych metod, które zostaną wywołane, gdy użytkownik naciśnie klawisz powrotu. Jeśli chcesz, aby użytkownik mógł dodać tylko jeden wiersz tekstu, użyjUITextField
. Naciśnięcie klawisza Return i ukrycie klawiatury dlaUITextView
nie jest zgodne z wytycznymi interfejsu.Nawet jeśli chcesz to zrobić, zaimplementuj
textView:shouldChangeTextInRange:replacementText:
metodęUITextViewDelegate
i sprawdź, czy tekst zastępczy jest\n
, ukryj klawiaturę.Mogą być inne sposoby, ale nie znam ich.
źródło
[textField setReturnKeyType: UIReturnKeyDone];
lub konstruktora interfejsówPomyślałem, że zamiast tego opublikuję fragment kodu tutaj:
Upewnij się, że deklarujesz wsparcie dla
UITextViewDelegate
protokołu.Aktualizacja Swift 4.0:
źródło
Wiem, że już na nie odpowiedziano, ale tak naprawdę nie lubię używać literału łańcuchowego dla nowej linii, więc oto co zrobiłem.
Aktualizacja Swift 4.0:
źródło
NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text]
.Wiem, że udzielono na nie odpowiedzi wiele razy, ale oto moje dwa centy na ten temat.
Bardzo przydatne okazały się odpowiedzi samvermette i ribeto , a także komentarz maxpower w ribeto . Ale z tymi podejściami jest problem. Problem, o którym Matt wspomina w samvermette , i to, że jeśli użytkownik chce wkleić coś z linią w środku, klawiatura ukryłaby się bez wklejania czegokolwiek.
Więc moje podejście jest mieszanką trzech wyżej wymienionych rozwiązań i sprawdzanie tylko, czy wprowadzony ciąg znaków jest nową linią, gdy długość łańcucha wynosi 1, więc upewniamy się, że użytkownik pisze zamiast wklejać.
Oto co zrobiłem:
źródło
Bardziej eleganckim sposobem jest zwolnienie klawiatury, gdy użytkownik stuknie gdzieś poza ramkę klawiatury.
Najpierw ustaw widok ViewController na klasę „UIControl” w inspektorze tożsamości w UIBuilder. Przeciągnij z wciśniętym klawiszem Control do pliku nagłówka ViewController i połącz go jako akcję ze zdarzeniem jako Touch Up Inside, na przykład:
ViewController.h
W głównym pliku ViewController ViewController.m:
Możesz wymagać podwójnego stuknięcia lub długiego dotyku przy użyciu podobnych technik. Może być konieczne ustawienie ViewController jako UITextViewDelegate i połączenie TextView z ViewController. Ta metoda działa zarówno dla UITextView, jak i UITextField.
Źródło: Big Nerd Ranch
EDYCJA: Chciałbym również dodać, że jeśli używasz UIScrollView, powyższa technika może nie działać tak łatwo przez Konstruktora interfejsów. W takim przypadku możesz użyć UIGestureRecognizer i zamiast tego wywołać metodę [[self view] endEditing: YES]. Przykładem może być:
Gdy użytkownik stuknie poza klawiaturę i nie dotknie miejsca na wejście, klawiatura się odrzuci.
źródło
GestureRecognizer
ale dużym problemem jest to, że nie można już klikać wszystkich przycisków ani kontroli w widoku.Dodaj tę metodę do kontrolera widoku.
Szybki :
Ta metoda może być również pomocna dla Ciebie:
źródło
super.touchesBegan(touches:withEvent:)
.else { return true }
.Dodaj także
UITextViewDelegate
Nie zapomnij potwierdzić protokołu
JEŚLI nie dodałeś
if([text isEqualToString:@"\n"])
, nie możesz edytowaćźródło
NO
jeśli tekst jest równy@"\n"
.Istnieje inne rozwiązanie podczas korzystania z uitextview. Możesz dodać pasek narzędzi jako InputAccessoryView w „textViewShouldBeginEditing”, a po zakończeniu przycisku tego paska narzędzi możesz zamknąć klawiaturę, kod tego jest następujący:
źródło
Znalazłem odpowiedź josebama na najbardziej kompletną i czystą odpowiedź dostępną w tym wątku.
Poniżej znajduje się dla niego składnia Swift 4 :
źródło
resultRange
mają na celu sprawdzenie, czy tekst zawiera tylko znaki nowej linii, który unika ciężkiej kodu „\ n”.szybki
źródło
Użycie kontrolera nawigacyjnego do obsługi paska do zwolnienia klawiatury:
w pliku .h:
w pliku .m:
źródło
Podobnie jak matowy komentarz do samvermette, nie podoba mi się pomysł wykrycia „\ n”. Klawisz „return” istnieje z jakiegoś powodu w UITextView, to znaczy, aby przejść oczywiście do następnego wiersza.
Moim zdaniem najlepszym rozwiązaniem jest naśladowanie aplikacji do przesyłania wiadomości iPhone'a - dodawanie paska narzędzi (i przycisku) na klawiaturze.
Mam kod z następującego postu na blogu:
http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/
Kroki:
-Dodaj pasek narzędzi do pliku XIB - ustaw wysokość na 460
-Dodaj przycisk na pasku narzędzi (jeśli jeszcze nie został dodany). Jeśli chcesz wyrównać do prawej, dodaj również element przycisku paska elastycznego do XIB i przesuń element przycisku paska narzędzi
-Utwórz akcję łączącą element przycisku, aby zrezygnować z usługi FirstResponder w następujący sposób:
-Następnie:
źródło
Właśnie rozwiązałem ten problem w inny sposób.
Sterowanie przeciągnij przycisk do
viewController.h
pliku i utwórz akcję (Wysłane zdarzenie: retusz wewnątrz), na przykład:W
ViewController.m
powinna wyglądać następująco:źródło
Dodaj obserwatora w viewDidLoad
a następnie użyj selektora, aby sprawdzić „\ n”
Używa „\ n” i nie sprawdza specjalnie klucza powrotnego, ale myślę, że to jest OK.
AKTUALIZACJA
Zobacz odpowiedź ribto poniżej, która używa
[NSCharacterSet newlineCharacterSet]
zamiast\n
źródło
\n
a klucz powrotu jest wykrywany na podstawie,\n
więc sprawdza klucz powrotu. Jedyną różnicą jest to, że używasz powiadomień, a nie textViewDelegates.[NSCharacterSet newlineCharacterSet]
zamiast \ n może być lepszym sposobem.Kod SWIFT
Zaimplementuj UITextViewDelegate w swojej klasie / widoku w następujący sposób:
ustaw delegata textView na siebie
A następnie zaimplementuj następujące:
EDYCJA Zaktualizowałem kod, ponieważ nigdy nie jest dobrym pomysłem zmiana danych wprowadzanych przez użytkownika w polu tekstowym na obejście problemu i nie resetowanie stanu po zakończeniu hakowania.
źródło
Spróbuj tego :
źródło
// Możesz użyć tego ...
Krok 1. Pierwszym krokiem jest upewnienie się, że deklarujesz obsługę
UITextViewDelegate
protokołu. Odbywa się to w pliku nagłówka, na przykład tutaj jest nagłówek o nazwieEditorController.h:
Krok 2. Następnie musisz zarejestrować kontroler jako delegat UITextView. Kontynuując powyższy przykład, oto jak zainicjowałem za
UITextView
pomocąEditorController
jako delegata…Krok 3. A teraz ostatnim elementem układanki jest podjęcie działań w odpowiedzi na
shouldCahngeTextInRange
wiadomość w następujący sposób:źródło
Możesz także ukryć klawiaturę, dotykając ekranu widoku:
źródło
Szybka odpowiedź:
źródło
Użyłem tego kodu do zmiany respondera.
źródło
Pytanie brzmi, jak to zrobić za pomocą klawisza Return, ale myślę, że może to pomóc komuś, kto chce po prostu zniknąć z klawiatury podczas korzystania z UITextView:
Zadzwoń addToolBarForTextView () w viewDidLoad lub innej metody cyklu życia.
Wydaje się, że było to dla mnie idealne rozwiązanie.
Twoje zdrowie,
Murat
źródło
Ok. Wszyscy udzielają odpowiedzi za pomocą sztuczek, ale myślę, że właściwym sposobem jest osiągnięcie tego celu
Łączenie następującej akcji ze zdarzeniem „ Did End On Exit ” w
Interface Builder
. (kliknij prawym przyciskiem myszyTextField
i przeciągnij cntrl z „ Did end on exit ” na następującą metodę.źródło
Podobne do innych odpowiedzi przy użyciu,
UITextViewDelegate
ale nowszego szybkiego interfejsu,isNewline
byłoby:źródło
źródło
źródło
Wiem, że to nie jest dokładna odpowiedź na to pytanie, ale znalazłem ten wątek po przeszukaniu Internetu w poszukiwaniu odpowiedzi. Zakładam, że inni podzielają to uczucie.
Jest to moja odmiana UITapGestureRecognizer, który uważam za niezawodny i łatwy w użyciu - wystarczy ustawić delegata TextView na ViewController.
Zamiast ViewDidLoad dodaję UITapGestureRecognizer, gdy TextView staje się aktywny do edycji:
Kiedy stukam poza TextView, widok kończy tryb edycji, a UITapGestureRecognizer usuwa się, dzięki czemu mogę kontynuować interakcję z innymi kontrolkami w widoku.
Mam nadzieję, że to pomoże. Wydaje się to takie oczywiste, ale nigdy nie widziałem tego rozwiązania w Internecie - czy robię coś złego?
źródło
Nie zapomnij ustawić delegata dla textView - w przeciwnym razie rezygnacja z pierwszego korespondenta nie zadziała.
źródło
Spróbuj tego .
źródło
Dla Xcode 6.4., Swift 1.2. :
źródło
Powinieneś dodać
UIToolbar
do góry UITextView, aby było łatwiejsze niż używanieshouldChangeTextIn
W Swift 4
źródło
toolbar.sizeToFit()