webentwicklung-frage-antwort-db.com.de

Wie kann der Ersthelfer aus dem Textfeld entfernt werden, wenn der Benutzer an einer anderen Stelle antippt?

Ich habe meine Ansicht mit ScrollView gefüllt (die gleiche Größe wie die Ansicht), und ich bleibe dabei, wie der Ersthelfer gekündigt wird, wenn der Benutzer an einer anderen Stelle in der Ansicht (oder der Scrollansicht) antippt. Irgendeine Idee, wie das geht? Ich verwende die folgende Methode, aber es funktioniert nicht wie erwartet:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Danke fürs Helfen

Stephane

24
Steve

Ich habe hier eine Antwort gefunden: link

Wenn es Ihr oberstes Ziel ist, den Ersthelfer zurückzutreten, ist dies sollte funktionieren: [self.view endEditing: YES]

Diese Methode ist genau dafür ausgelegt! Referenz: endEditing:

Bewirkt, dass die Ansicht (oder eines der eingebetteten Textfelder) den Status des ersten Responders ablehnt.

79
DanSkeel

Um eine robustere und sauberere Lösung zu erhalten, fügen Sie Ihrer primären Ansicht eine Erkennungsfunktion für Gesten hinzu. 

Dies funktioniert besser mit verschachtelten Ansichten und ist sauberer als die geheimen Schaltflächen im Code- und UI-Builder.

In Ihrer Sicht wurde geladen:

UITapGestureRecognizer* tapBackground = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)];
[tapBackground setNumberOfTapsRequired:1];
[self.view addGestureRecognizer:tapBackground];

..und definieren Sie Ihre Zielaktion, die beim Tippen ausgelöst werden soll:

-(void) dismissKeyboard:(id)sender
{
    [self.view endEditing:YES];
}
18
Andres Canella

Die beste Option ist der kürzeste Weg;)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}
9
Onder OZCAN

Für Swift 3 und Swift 4 können Sie Folgendes tun:

func viewDidLoad() {
    super.viewDidLoad()

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.hideKeyboardByTappingOutside))

    self.view.addGestureRecognizer(tap)
}

@objc func hideKeyboardByTappingOutside() {
    self.view.endEditing(true)
}
8
pableiros

UIViewController erbt von UIResponder. Ein naiver Weg (ich bin mir ziemlich sicher, dass dies nicht der beste Weg ist), wäre das Überschreiben der folgenden Methoden (mindestens eine davon).

– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
- touchesCancelled:withEvent:

Als Nächstes können Sie die berührte Ansicht erhalten, indem Sie tun

UITouch *touch = [touches anyObject];
UIView *touchedView = [touch view];

kündigen Sie den Ersthelfer ab, wenn diese Ansicht nicht Ihr Textfeld ist

if(touchedView != textField){
    [textField resignFirstResponder];
}

_

Nachteile dieses Ansatzes:

Sie müssen das "Tippen" selbst erledigen. (Das gleiche Problem wie das alte iOS 3.1 oder früher). Sie müssen sich Ihre eigene Implementierung ausdenken, um einzelne Taps von Drag, Swipes, Double Taps, Long Taps usw. zu unterscheiden (Timings, Entfernungen, Schwellenwerte zählen!) Das hängt jedoch von Ihren Bedürfnissen ab.

Wenn Ihre Ansichtsstruktur einfach genug ist, können Sie der Containeransicht eine Gestenerkennung hinzufügen und den ersten Antwortenden bei jedem Aufruf des Handlers zurückweisen.

Hoffe das hilft

4
nacho4d

Bisher hat noch niemand die beste Antwort präsentiert:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Aus der Dokumentation zu dieser Methode:

Normalerweise wird diese Methode von einem UIControl-Objekt aufgerufen, das der Benutzer hat berührt. Die Standardimplementierung löst die Aktionsmethode aus zum angegebenen Zielobjekt oder, wenn kein Ziel angegeben ist, zum ersten Responder . Unterklassen können diese Methode überschreiben, um spezielles .__ auszuführen. Versand von Aktionsnachrichten.

Ich habe den relevanten Teil dieses Absatzes hervorgehoben. Durch die Angabe von nil für den Parameter to: rufen wir automatisch den angegebenen Selektor auf dem ersten Responder auf, wo auch immer er sich befindet, und müssen nicht wissen, wo sich die Ansichtshierarchie befindet. Dies kann auch verwendet werden, um andere Methoden für den Ersthelfer aufzurufen, nicht nur, dass er den Ersthelferstatus aufgibt.

3
Gavin
    -(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [self.TextField resignFirstResponder];

    return YES;
}
3

Geben Sie Ihrem UITextfield (d. H. 333) ein eindeutiges Tag.

UITextField *textField = (UITextField *)[self.view viewWithTag:333];
[textField resignFirstResponder];
2
Lefteris
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapTodissmiss)];

[self.view addGestureRecognizer:tap];

und Wahlschalter

-(void)TapTodissmiss{

    [self.txtffld resignFirstResponder];

}
1
Ghanshyam Tomar

Erstellen Sie einfach eine IBOutlet oder einen Zeiger auf das Textfeld und rufen Sie [textField resignFirstResponder]; dort auf, wo Sie möchten.

1
Or Ron

Dies ist der einfachste Weg, den ich gefunden habe und der beständig funktioniert. Fügen Sie der Ansicht einfach eine Tippen-Gestenerkennung hinzu, und schon können Sie loslegen. 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

[self.view endEditing:YES];

}

0
Andrew Cook

Für meine Implementierung hat [self.view endEditing: YES] nicht funktioniert. 

Um sicher zu gehen, dass die Tastatur verborgen ist, musste ich eine meiner Ansichten als Ersthelfer abgeben und diese dann sofort gemäß der folgenden Funktion aufgeben:

-(void) hideKeyboardPlease{
   [uiTextTo becomeFirstResponder];
   [uiTextTo resignFirstResponder];
}
0
Lenny

Wenn möglich, ist die beste Option, stattdessen UIView von UIButton zu erben. 

Sie müssen es nur im Interface Builder ändern und sofort erhalten Sie die Optionen zum Erstellen einer Aktion "Touch Up Inside" wie jede andere Schaltfläche. 

Ihre Ansicht funktioniert wie gewohnt, da UIButton immer noch eine Ansicht ist. Sie werden jedoch benachrichtigt, wenn jemand auf die Ansicht tippt. Dort kannst du anrufen 

[self.view endEditing:YES];

Um eine Tastatur neu zu bestimmen.

Bitte beachten Sie, dass diese Lösung nicht für Sie geeignet ist, wenn Ihre Ansicht eine UIScrollView ist.

0
Julio Bailon

Update

Ich habe einen anderen einfachen Weg gefunden 

einfach eine Eigenschaft deklarieren: -

@property( strong , nonatomic) UITextfield *currentTextfield;

und ein Geste für die Gestenerkennung: -

@property (strong , nonatomic) UITapGestureRecognizer *resignTextField;

In ViewDidLoad

_currentTextfield=[[UITextField alloc]init];
_resignTextField=[[UITapGestureRecognizer alloc]initWithTarget:@selector(tapMethod:)];

[self.view addGestureRecognizer:_resignTextField];

Implementiere die Textfeld-Delegatmethode didBeginEditing

 -(void)textFieldDidBeginEditing:(UITextField *)textField{


      _currentTextfield=textField;

    }

Implementiere deine Tap-Gesten-Methode (_resignTextField)

 -(void)tapMethod:(UITapGestureRecognizer *)Gesture{

     [_currentTextfield resignFirstResponder];

 }
0
dreamBegin

Erstellen Sie Ihr IBOutlet in der Datei ViewController.h wie folgt:

//YOUR ViewController.h FILE

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    //WIRE THIS WITH YOUR UITextField OBJECT AT YOUR .xib FILE
    IBOutlet UITextField *yourIBOutletUITextField;
}

@end

Fügen Sie dies Ihrer ViewController.m-Datei hinzu:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     [yourIBOutletUITextField resignFirstResponder];
}

wie unten:

//YOUR ViewController.m FILE

#import "ViewController.h"

@implementation ViewController


//ADD THIS METHOD BELOW
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     [yourIBOutletUITextField resignFirstResponder];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    }

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end
0
EFE

Das ist was ich mache...

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideAllKeyboards)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];

-(void) hideAllKeyboards {
    [textField_1 resignFirstResponder];
    [textField_2 resignFirstResponder];
    [textField_3 resignFirstResponder];
    .
    .
    .
    [textField_N resignFirstResponder];
}
0
Fahim Parkar