it-swarm.com.de

So schließen Sie die Nummerntastatur durch Tippen auf eine beliebige Stelle

Ich würde gerne den einfachsten Code kennen, um die Tastatur auf dem Nummernblock zu verwerfen, wenn Sie irgendwo außerhalb des Nummernblocks tippen. Es ist eine einfache Anwendung, um eine Nummer in ein Textfeld einzugeben. Anschließend kann ein Benutzer die Tastatur schließen, nachdem der Benutzer die Eingabe der Zahlen in das Textfeld abgeschlossen hat. Vielen Dank! :)

49
jsanmtosj

Deklarieren Sie das Textfeld als Instanzvariable oder Eigenschaft, wenn es noch nicht vorhanden ist, und implementieren Sie eine einfache Methode wie die folgende:

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

wird gut tun.

85
Filip Radelic

Versuchen Sie diese Methode, 

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

Tippen Sie jetzt auf eine beliebige Stelle und sehen Sie, dass die Tastatur verworfen wird. :-)

21

Für den schnellen Gebrauch unterhalb des Codes

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
 {
       textFiled.resignFirstResponder()
 }

Checke das neueste Update unter folgendem Link

7
abdul sathar

Berühren des Hintergrunds zum Schließen der Tastatur

Gehen Sie zu Xcode, falls Sie noch nicht dort sind. Wir müssen unserer Controller-Klasse eine weitere Aktion hinzufügen. Fügen Sie Ihrer Control_FunViewController.h-Datei die folgende Zeile hinzu: 

#import <UIKit/UIKit.h>
@interface Control_FunViewController : UIViewController { 
UITextField *nameField;
UITextField *numberField;
}
 @property (nonatomic, retain) IBOutlet UITextField *nameField; ]
@property (nonatomic, retain) IBOutlet UITextField *numberField; 
- (IBAction)textFieldDoneEditing:(id)sender; 
- (IBAction)backgroundTap:(id)sender; 
@end  

Speichern Sie die Headerdatei. Wechseln Sie zur Implementierungsdatei, und fügen Sie diesen Code hinzu, der einfach beide Textfelder anweist, den Status des ersten Responders anzugeben, wenn sie über den Status verfügen. Es ist absolut sicher, resignFirstResponder für ein Steuerelement aufzurufen, das nicht der erste Responder ist. Daher können wir es sicher für beide Textfelder aufrufen, ohne überprüfen zu müssen, ob einer der ersten Responder ist.

- (IBAction)backgroundTap:(id)sender { 
[nameField resignFirstResponder]; 
[numberField resignFirstResponder];
}

TIPSpeichern Sie diese Datei, und kehren Sie zum Interface Builder zurück. Wir müssen jetzt die zugrunde liegende Klasse unserer Ansicht ändern. Wenn Sie das Hauptfenster der Spitze betrachten, werden in dieser Ansicht drei Symbole angezeigt. Die dritte Ansicht, "Ansicht" genannt, ist die Hauptansicht unserer Feder, die alle anderen Steuerelemente und Ansichten als Unteransichten enthält. Klicken Sie einfach auf das Symbol "Ansicht", das die Containeransicht unserer Feder darstellt. Drücken Sie ␣4, um den Identitätsinspektor aufzurufen. Hier können wir die zugrunde liegende Klasse einer Objektinstanz im Interface Builder ändern.

Sie werden beim Codieren viel zwischen Header- und Implementierungsdateien wechseln. Glücklicherweise verfügt Xcode über eine Tastenkombination, mit der Sie schnell zwischen diesen Dateien wechseln können. Die Standard-Tastenkombination ist ␣␣␣ (Options-Befehl-Aufwärtspfeil), Sie können sie jedoch mit den Xcode-Voreinstellungen beliebig ändern 

Das mit Class beschriftete Feld lautet derzeit UIView. Ändern Sie es, um UIControl zu lesen. Alle Steuerelemente, die Aktionsmethoden auslösen können, sind Unterklassen von UIControl. Wenn Sie also die zugrunde liegende Klasse ändern, haben wir dieser Ansicht gerade die Möglichkeit gegeben, Aktionsmethoden auszulösen. Sie können dies überprüfen, indem Sie ␣2 drücken, um den Verbindungsinspektor aufzurufen. 

Ziehen Sie vom Touchdown-Ereignis auf das Symbol des Dateieigners und wählen Sie die Aktion backgroundTap: aus. Berührungen an einer beliebigen Stelle in der Ansicht ohne aktives Steuerelement lösen jetzt unsere neue Aktionsmethode aus, wodurch die Tastatur zurückgezogen wird.

NOTESave die Spitze, und lass uns zurückgehen und es versuchen. Kompilieren Sie Ihre Anwendung und führen Sie sie erneut aus. Dieses Mal sollte die Tastatur nicht nur ausgeblendet werden, wenn Sie auf die Schaltfläche "Fertig" tippen, sondern auch, wenn Sie auf eine beliebige Stelle klicken, die kein aktives Steuerelement ist. Dies ist das Verhalten, das Ihr Benutzer erwartet.

6
rptwsthi

Ich habe versucht, einige der Lösungen hier zu implementieren und stellte fest, dass einige Probleme mit ihnen auftraten. Insbesondere enthält My UIView eine UIScrollView, die Berührungen abzufangen scheint.

Als dies fehlschlug, dachte ich, dass "Tippen auf eine beliebige Stelle" ein bisschen ein unbestimmtes Verhalten ist, und der Benutzer muss raten, die Tastatur zu schließen, anstatt ihnen klare Anweisungen zu geben.

Ich habe auch eine "Zurück" - oder "Fertig" -Taste auf jeder anderen Tastatur, die in der App angezeigt wird. Daher wollte ich dem Benutzer eine einfache, intuitive und klar definierte Möglichkeit geben, die Tastatur mit einem Nummernblock zu schließen in Übereinstimmung mit den anderen verwendeten Tastaturkündigungsmechanismen.

Mir ist klar, dass dies nicht genau das ist, was das OP anfordert, aber ich glaube, dass es eine bessere Lösung ist als die Anforderung "Tippen Sie irgendwo" (und es ist einfach zu implementieren!).

Der folgende Code wird als Teil von -viewDidLoad in meiner UIViewController aufgerufen.

// My app is restricted to portrait-only, so the following works
UIToolbar *numberPadAccessoryInputView      = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)];

// My app-wide tint color is a gold-ish color, so darkGray contrasts nicely
numberPadAccessoryInputView.barTintColor    = [UIColor darkGrayColor];

// A basic "Done" button, that calls [self.textField resignFirstResponder]
UIBarButtonItem *numberPadDoneButton        = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.textField action:@selector(resignFirstResponder)];

// It's the only item in the UIToolbar's items array
numberPadAccessoryInputView.items           = @[numberPadDoneButton];

// In case the background of the view is similar to [UIColor darkGrayColor], this
// is put as a contrasting Edge line at the top of the UIToolbar
UIView *topBorderView                       = [[UIView alloc] initWithFrame:CGRectMake(0, 0, numberPadAccessoryInputView.frame.size.width, 1.0f)];
topBorderView.backgroundColor               = [UIColor whiteColor];
[numberPadAccessoryInputView addSubview:topBorderView];

// Make it so that this UITextField shows the UIToolbar
self.textField.inputAccessoryView           = numberPadAccessoryInputView;

Damit gibt es eine nette, hübsche, intuitive Steuerung am oberen Rand der Tastatur, die deutlich anzeigt, wie der Benutzer vorgehen soll, wenn er mit der Texteingabe fertig ist. 

Ich bin immer noch der Meinung, dass Apple für diese Tastatur eine Schaltfläche "Fertig" bereitstellen sollte (wie der Link, der von Janak Nirmal gepostet wurde), aber dies ist die eleganteste Lösung, die nicht von Apple stammt. 

3
mbm29414

Dazu müssen Sie UITapGestureRecognizer verwenden.

UITapGestureRecognizer *tapToDismiss = [[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (dismissNumberKeyBoard:)];

Dann in Ihrer Methode dismissNumberKeyboard, 

-(Void)dismissNumberKeyboard : (id)sender {

   [yourTextField resignFirstResponder];

}

Viel Spaß beim Codieren!

2
Valentina

Machen Sie einfach eine einfache Funktion wie diese ..

    -(IBAction)hideKeyboard:(id)Sender
{
    [_textValue resignFirstResponder];
}

gehen Sie nun zu Ihrer Nib-Datei und verbinden Sie diese Funktion mit dem Textfeld mit didEndOnExit. Wenn Sie jetzt außerhalb des Textfelds klicken, wird sich die Tastatur verstecken.

1
Hadi

Sie können die Antwort von @ mbm wirklich gut implementieren, indem Sie eine didSet an der Steckdose platzieren und dort Ihre inputAccessoryView anhängen:

SWIFT-Code:

  @IBOutlet var input: UITextField! { didSet {
    let toolbar = UIToolbar(frame: CGRect(Origin: CGPoint.zero, size: CGSize(width: 0, height: 44)))
    toolbar.items = [
      UIBarButtonItem(barButtonSystemItem: .done, target: self.input,
        action: #selector(resignFirstResponder))
    ]
    input.inputAccessoryView = toolbar
  }}

In xcode 8/iOS 10 sieht es ungefähr so ​​aus:

 enter image description here

1
SimplGy

Wenn Sie einen benutzerdefinierten Nummernblock oder ein anderes Popover erstellt haben, wäre eine andere Lösung die Verwendung einer Gestenerkennung in der Init Ihres UIView:

tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self addGestureRecognizer:tapper];

 _yourViewController = [[CustomViewController alloc] init];
_yourPopoverController = [[UIPopoverController alloc] initWithContentViewController:_yourViewController];
_yourPopoverController.popoverContentSize = CGSizeMake(550, 300);
_yourViewController.delegate = self;

Und lassen Sie den Handgriff von handleSingleTap schließen, falls sichtbar, und brechen Sie die Bearbeitung ab:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    if ([_yourPopoverController isPopoverVisible]) {
        [_yourPopoverController dismissPopoverAnimated:YES];
    }

    [self endEditing:YES];
}
0
arinmorf

Für Swift 3/4 mag ich diesen Fall: 

  1. View Controller ist eine Unterklasse für UITextFieldDelegate 
  2. In der viewDidLoad-Funktion müssen Sie yourPhonePadField.delegate = self einstellen.
  3. Und überschreiben Sie diese Funktion:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       self.view.endEditing(true) 
    }
    
0

Wenn der Benutzer auf die Schaltfläche "Abbrechen" tippt, verwende ich normalerweise die Tastatur. 

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
    NSLog(@"cancel clicked");
    [searchBar resignFirstResponder]; // dismiss keyboard
    return;
}

Wenn Sie dies tun möchten, wenn der Benutzer eine Stelle außerhalb des Tastaturbereichs berührt, müssen Sie touchesEnded implementieren und diesen Code dort einfügen. 

/* Delegate for when touch ends.  */
-(void)touchesEnded:(NSSet *)touches 
          withEvent:(UIEvent *)event
{
    [searchBar resignFirstResponder];
}

Ich selbst habe das nicht ausprobiert, aber ich denke, das sollte den Trick tun ...

0

Ich musste eine ähnliche UX für meine UITableView implementieren (in der ein UITextField erscheint). Fügen Sie zunächst eine UITapGestureRecognizer zur tableView hinzu. Dadurch werden alle Abgriffe erfasst, die ab jetzt auftreten.

UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        [self.tableView addGestureRecognizer:tapGestureRecognizer];
        [tapGestureRecognizer release];

Der Nebeneffekt ist jedoch, dass Sie die Tastatur nicht entfernen möchten, wenn der Benutzer auf das UITextField-Objekt selbst tippt. Daher muss dieser Fall unterschieden werden.

Die Implementierung der handleTap-Methode sieht in etwa so aus:

/*
 In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider:
 a) Text field's clear button
 b) Text field
 */
-(void)handleTap:(UITapGestureRecognizer*)tapRecognizer 
{
    if(tapRecognizer.state == UIGestureRecognizerStateEnded) 
    {

            //Figure out where the user tapped
            CGPoint p = [tapRecognizer locationInView:textField];
            CGRect textFieldBounds = textField.bounds;
            CGRect clearButtonBounds = CGRectMake(textFieldBounds.Origin.x + textFieldBounds.size.width - 44, textFieldBounds.Origin.y, 44, textFieldBounds.size.height); 

            if(CGRectContainsPoint(clearButtonBounds, p))
                textField.text = @"";

            if(CGRectContainsPoint(textFieldBounds, p))
                return;

        [textField resignFirstResponder];
        //remove the tap gesture recognizer that was added.
        for(id element in self.tableView.gestureRecognizers)
        {
        if([element isKindOfClass:[UITapGestureRecognizer class]])
        {
            [self.tableView removeGestureRecognizer:element];
        }
        }
    }
        [self commitNewText];
    }
}

HTH. Markiere es als Antwort, wenn es dir gefällt.

-Akshay

0
Akshay

Für Swift ist es am einfachsten, die Tastatur für alle Textfelder durch Tippen auf eine Stelle außerhalb des Textfelds zu schließen:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
    self.view.endEditing(true)
}
0
XIII

Viele Antworten hier mussten sich jedoch mit XCode 5 herausfinden. Lesen Sie Folgendes: https://developer.Apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/ GestureRecognizer_basics/GestureRecognizer_basics.html

Fügen Sie Ihrer UIScrollView einen Tap-Gesten-Erkenner hinzu. Stellen Sie seinen Delegierten als Viewcontroller ein.

Fügen Sie diese Methode hinzu:

- (IBAction)tappedSomewhere:(id)sender {
    [self.view endEditing:YES];
}

zu Ihrem UIScrollView-Implementierungscode, und ordnen Sie ihn dem Tap Gesture Recognizer zu, indem Sie mit der Maus klicken und in den Implementierungscode ziehen.

Arbeitete für mich.

0
Bill Noto

In xcode 5 Verwenden Sie einen Tap-Gesten-Erkenner, und deklarieren Sie in .h mit der Aktion einen Namen und in .m 

- (IBAction)backgroundTap:(id)sender {
    [self.view endEditing: YES];
}
0
gerachev