Jak wyłączyć klawiaturę podczas edycji UITextField
Wiem, że muszę powiedzieć mojemu UITextField, aby zrezygnował z pierwszej odpowiedzi, gdy chcę zdemontować klawiaturę, ale nie jestem pewien, jak dowiedzieć się, kiedy użytkownik nacisnął klawisz "gotowe" na klawiaturze. Czy jest jakieś powiadomienie, na które mogę patrzeć?
22 answers
Ustawiłem delegata UITextField
na moją klasę ViewController
.
W tej klasie zaimplementowałem tę metodę w następujący sposób:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-01 20:05:01
Jeśli połączysz Zdarzenie DidEndOnExit pola tekstowego z akcją (IBAction) w Interfejsiebuilder, zostanie ono wysłane, gdy użytkownik odrzuci klawiaturę (klawiszem return), a nadawca będzie odniesieniem do pola UITextField, które wywołało Zdarzenie.
Na przykład:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
Następnie, w Interfejsiebuilder, połącz Zdarzenie DidEndOnExit pola tekstowego z tą akcją na kontrolerze (lub czymkolwiek używasz do łączenia zdarzeń z interfejsu użytkownika). Ilekroć użytkownik wprowadzi tekst i odrzuca pole tekstowe, kontroler zostanie wysłany tę wiadomość.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-04 20:27:56
Możesz również utworzyć metodę w kontrolerze
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
A następnie W Connection Inspector w zdarzeniu IB connect "Did End On Exit" do niego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 20:20:55
Kubi, dzięki. Twój kod zadziałał. Aby być jawnym (dla początkujących), jak mówisz, musisz ustawić UITextField
' s delegate
na równe ViewController, w którym znajduje się pole tekstowe. Możesz to robić, gdzie tylko zechcesz. Wybrałem metodę viewDidLoad
.
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 13:20:44
Oto sztuczka, aby uzyskać automatyczne zwolnienie klawiatury bez kodu w ogóle. W nib Edytuj obiekt proxy pierwszej odpowiedzi w Inspektorze tożsamości, dodając nową akcję pierwszej odpowiedzi; nazwijmy ją dummy:
. Teraz zaczep Zdarzenie Did End on Exit pola tekstowego do akcji dummy:
obiektu Proxy First Responder. To jest to! Ponieważ zdarzenie End on Exit ma teraz parę akcja-cel, pole tekstowe automatycznie odrzuca klawiaturę, gdy użytkownik dotknie Return; a ponieważ nie ma kary za nie znalezienie obsługi dla wiadomości wysłanej w łańcuchu odpowiedzi, aplikacja nie zawiesza się, nawet jeśli nie ma implementacji dummy:
gdziekolwiek.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-14 22:51:33
Po prostu dodaj
[textField endEditing:YES];
Gdzie chcesz wyłączyć klawiaturę i wyświetlić widok wyboru.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 20:16:47
W języku Swift można zapisać IBAction w kontrolerze i ustawić Did End przy wyjściu Zdarzenie pola tekstowego do tej akcji
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-08 23:22:18
Swift 4.2
i będzie działać w 100%
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
// hide key board when the user touches outside keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// user presses return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-09 03:50:58
Możesz również użyć
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
Najlepszy jeśli masz wiele Uitextfields :
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-15 04:50:52
[[3]} Oto, co musiałem zrobić, aby go uruchomić, i myślę, że jest to konieczne dla każdego, kto ma klawiaturę numeryczną (lub inne bez przycisku done:
- zmieniłem UIView w ViewController na UIControl.
-
Stworzyłem funkcję o nazwie
-(IBAction)backgroundIsTapped:(id)sender
Zostało to również zdefiniowane w .plik H.
Po tym, połączyłem się z bitem "dotknięcia" dla Viewcontrollera w Interface Builder.
In the 'background is tapped' function, I put this:
[answerField resignFirstResponder];
Pamiętaj tylko, aby zmienić 'answerField' na nazwę UITextField, z którego chcesz usunąć klawiaturę (oczywiście upewnij się, że Twój UITextField jest zdefiniowany jak poniżej:)
IBOutlet UITextField * <nameoftextfieldhere>;
Wiem, że ten temat umarł dawno temu... ale mam nadzieję, że to komuś pomoże, gdzieś!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 16:52:57
Zauważysz, że metoda "textFieldShouldReturn" dostarcza obiekt pola tekstowego, który nacisnął klawisz DONE. Jeśli ustawisz znacznik, możesz włączyć to pole tekstowe. Możesz też śledzić i porównywać wskaźnik obiektu z pewną wartością składową przechowywaną przez jego twórcę.
Moje podejście do samodzielnej nauki Jest Takie:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
Tymczasem umieszczam test "walidacji", który zaprzecza rezygnacji. Jest to tylko dla ilustracji, więc jeśli użytkownik wpisze nr! w polu, to nie odrzuci. Zachowanie było takie, jak chciałem, ale sekwencja wyjścia nie była taka, jak oczekiwałem.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
Poniżej znajduje się moje wyjście NSLog dla tej odmowy, a następnie akceptacja. Zauważysz, że zwracam wynik rezygnacji, ale spodziewałam się, że zwróci się do mnie fałszywie, aby zgłosić się do rozmówcy?! Poza tym ma niezbędne zachowanie.
13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 13.327 StudyKbd[109:207] NO! 13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard 59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO 59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 13:16:21
Oto całkiem czysty sposób na zakończenie edycji za pomocą klawisza powrotu lub dotknięcia w tle.
W Interface builder osadzaj swoje pola w widoku klasy UIFormView
Co robi ta klasa:
- automatycznie dołącza się jako delegat pól (obudzony z nib lub dodany ręcznie)
- Zachowaj odniesienie w bieżącym edytowanym polu
- Wyłącz klawiaturę po powrocie lub dotknięciu w tle
Oto kod :
interfejs
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
realizacja
#import "UIFormView.h"
@implementation UIFormView
{
UITextField* currentEditingTextField;
}
// Automatically register fields
-(void)addSubview:(UIView *)view
{
[super addSubview:view];
if ([view isKindOfClass:[UITextField class]]) {
if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
}
}
// UITextField Protocol
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
currentEditingTextField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
currentEditingTextField = NULL;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self endEdit];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self textFieldValueIsValid:textField]) {
[self endEdit];
return YES;
} else {
return NO;
}
}
// Own functions
-(void)endEdit
{
if (currentEditingTextField) {
[currentEditingTextField endEditing:YES];
currentEditingTextField = NULL;
}
}
// Override this in your subclass to handle eventual values that may prevent validation.
-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
return YES;
}
@end
Poprzez podklasowanie formularza i nadpisanie
textFieldValueIsValid:
method, you można uniknąć zakończenia edycji, jeśli wartość nie jest poprawna dla podanego pole.-
Jeśli pole ma delegata ustawionego w Kreatorze interfejsów, to Formularz go nie zmienia. Nie widzę wielu powodów, aby ustawić inny delegat do konkretnego pola, ale dlaczego nie ...
Osobiście trzymam go w moim frameworku i zawsze podklasuję go, aby dodać funkcje, Jest to dość często przydatne "tak, jak jest".
Mam nadzieję, że to pomoże. Pozdrawiam wszystkichWarning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 01:08:48
Jeśli chcesz całą edycję w UIViewController możesz użyć.
[[self view]endEditing:YES];
A jeśli chcesz usunąć perticular UITextField Keyboard hide to użyj.
1.dodaj delegata do kontrolera viewcontroller.h
<UITextFieldDelegate>
-
Sprawi, że delegacja nie będzie mogła zostać wysłana do twojego pola tekstowego .
Siebie.yourTextField.delegate = self;
-
Dodaj tę metodę do kontrolera viewcontroller.
-(BOOL)textFieldShouldEndEditing: (UITextField *)textField{ [textField / align = "left" / ]; return YES;}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-03 10:25:29
Programowo ustawia delegata UITextField w swift 3
Zaimplementuj UITextFieldDelegate w kontrolerze ViewController.Plik Swift (np. Klasa ViewController: UIViewController, UITextFieldDelegate { )
lazy var firstNameTF: UITextField = {
let firstname = UITextField()
firstname.placeholder = "FirstName"
firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
firstname.textAlignment = .center
firstname.borderStyle = UITextBorderStyle.roundedRect
firstname.keyboardType = UIKeyboardType.default
firstname.delegate = self
return firstname
}()
lazy var lastNameTF: UITextField = {
let lastname = UITextField()
lastname.placeholder = "LastName"
lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
lastname.textAlignment = .center
lastname.borderStyle = UITextBorderStyle.roundedRect
lastname.keyboardType = UIKeyboardType.default
lastname.delegate = self
return lastname
}()
lazy var emailIdTF: UITextField = {
let emailid = UITextField()
emailid.placeholder = "EmailId"
emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
emailid.textAlignment = .center
emailid.borderStyle = UITextBorderStyle.roundedRect
emailid.keyboardType = UIKeyboardType.default
emailid.delegate = self
return emailid
}()
/ / Mark:- obsługa pola tekstowego delegata..
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == firstNameTF {
lastNameTF.becomeFirstResponder()
}
else if textField == lastNameTF {
emailIdTF.becomeFirstResponder()
}
else {
view.emailIdTF(true)
}
return true
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 05:27:08
Utwórz funkcję hidekeyboard i połącz ją z pole tekstowe w .plik xib i wybierz DidEndOnExit
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 10:12:12
Jeśli został utworzony Widok za pomocą narzędzia Interface Builder, Użyj następującego Po prostu utwórz metodę,
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
Po prostu kliknij prawym przyciskiem myszy pole tekstowe w widoku i ustaw zdarzenie tak, jak zakończyło się przy wyjściu, i podłącz je do metody "dismissskeyboard".
Najlepszym przewodnikiem dla początkujących jest "Head First iPhone and iPad Development, 2nd Edition"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 19:18:58
Spróbuj tego
- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 13:52:16
//====================================================
// textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
if(textField.returnKeyType != UIReturnKeyDone){
[[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
}
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 02:52:43
Ktoś szuka Swift 3
1) Upewnij się, że Twój Delegat Uitextfielda jest podłączony do Twojego kontrolera ViewController w Storyboardzie
2) zaimplementuj UITextFieldDelegate w kontrolerze ViewController.Plik Swift (np. Klasa ViewController: UIViewController, UITextFieldDelegate {)
3) użyj metody delegata poniżej
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-06 15:53:37
Tak w Swifcie 4.2 zwalniam klawiaturę i u mnie działa:
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:
#selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
numberField.resignFirstResponder()
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 08:52:11
Swift 3, Ios 9 +
@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}
UPD: to nadal działa dobrze dla mnie. Myślę, że facet, który poświęcił tę odpowiedź, po prostu nie rozumiał, że musi powiązać tę akcję z UITextField w storyboardzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 19:49:21
textField.returnKeyType = UIReturnKeyDone;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-30 13:21:03