Hoe iOS-toetsenbord programmatisch te sluiten wanneer u op Return drukt

Ik heb programmatisch een UITextFieldgemaakt, waardoor het UITextFieldeen eigenschap is van de viewController. Ik moet het toetsenbord sluiten met de terugkeer en de aanraking op het scherm. Ik kon het scherm aanraken om te verwijderen, maar op Return drukken werkt niet.

Ik heb gezien hoe ik dit moet doen met storyboards en door het UITextField-object rechtstreeks toe te wijzen en te initialiseren zonder het als een eigenschap te maken. Mogelijk om te doen?

.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITextFieldDelegate>
@property (strong, atomic) UITextField *username;
@end

.m

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"touchesBegan:withEvent:");
    [self.view endEditing:YES];
    [super touchesBegan:touches withEvent:event];
}
@end

Antwoord 1, autoriteit 100%

De eenvoudige manier is om de gemachtigde van UITextFieldte verbinden met zichzelf (self.mytestField.delegate = self) en het toetsenbord te sluiten in de methode textFieldShouldReturnmet behulp van [textField resignFirstResponder];

Een andere manier om het toetsenbord te sluiten is de volgende:

Doelstelling-C

[self.view endEditing:YES];

Snel:

self.view.endEditing(true)

Zet [self.view endEditing:YES];waar u het toetsenbord wilt sluiten (knopgebeurtenis, aanraakgebeurtenis, enz.).


Antwoord 2, autoriteit 11%

Voeg een gedelegeerde methode van UITextFieldals volgt toe:

@interface MyController : UIViewController <UITextFieldDelegate>

En stel uw textField.delegate = self;in en voeg dan ook twee gedelegeerde methoden toe van UITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}
// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Antwoord 3, autoriteit 10%

gebruik dit gewoon in swift om het toetsenbord te sluiten:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Swift 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)

Antwoord 4, autoriteit 9%

//Toetsenbord verbergen door achtergrond in beeld aan te raken

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

Antwoord 5, autoriteit 7%

SWIFT 4:

self.view.endEditing(true)

of

Stel de gemachtigde van het tekstveld in op de huidige viewcontroller en dan:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

Doelstelling-C:

[self.view endEditing:YES];

of

Stel de gemachtigde van het tekstveld in op de huidige viewcontroller en dan:

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

Antwoord 6, autoriteit 3%

In de App Delegate kunt u schrijven

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

gebruik deze manier, je kunt niet te veel code schrijven.


Antwoord 7, autoriteit 2%

Probeer een idee te krijgen van wat een eerstehulpverlener is in de iOS-weergavehiërarchie. Wanneer uw tekstveld actief wordt (of eerstehulpverlener) wanneer u erin tikt (of het de boodschap becomeFirstResponderprogrammatisch doorgeeft), presenteert het het toetsenbord. Dus om te voorkomen dat uw tekstveld de eerste responder is, moet u het bericht resignFirstResponderdaar naartoe sturen.

[textField resignFirstResponder];

En om het toetsenbord op de return-knop te verbergen, moet u de gedelegeerde methode textFieldShouldReturn:implementeren en het bericht resignFirstResponderdoorgeven.

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

Antwoord 8, autoriteit 2%

Dit is wat ik in mijn code gebruik. Het werkt als een tierelier!

Voeg in yourviewcontroller.h toe:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Voeg nu in het .m-bestand dit toe aan uw ViewDidLoad-functie:

- (void)viewDidLoad {
    [super viewDidLoad];
    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Voeg ook deze functie toe aan het .m-bestand:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

Antwoord 9, autoriteit 2%

Voor een groep UITextView‘s in een ViewController:

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Doelstelling-C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}

Antwoord 10

Om een ​​toetsenbord te sluiten nadat het toetsenbord is verschenen, zijn er 2 gevallen,

  1. wanneer het UITextField zich in een UIScrollView

  2. bevindt

  3. wanneer het UITextField buiten een UIScrollView

  4. is

2.wanneer het UITextField zich buiten een UIScrollView bevindt
overschrijf de methode in uw UIViewController-subklasse

je moet ook gedelegeerde toevoegen voor alle UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. In een scrollweergave zal buiten tikken geen enkele gebeurtenis activeren, dus gebruik in dat geval een tikgebaarherkenning,
    Sleep een UITapGesturevoor de scroll-weergave en maak er een IBA-actie voor.

om een ​​IBA-actie te maken, drukt u op ctrl+ klik op de UITapGesture en sleept u deze naar het .h-bestand van de viewcontroller.

Hier heb ik tappedEvent genoemd als mijn actienaam

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

de bovenstaande informatie is afgeleid van de volgende link. Raadpleeg voor meer informatie of neem contact met mij op als u de bovenstaande gegevens niet begrijpt.

http:/ /samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


Antwoord 11

Ik weet dat dit door anderen is beantwoord, maar ik vond een ander artikel dat ook geen achtergrondgebeurtenis behandelde – tableview of scrollview.

http:/ /samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


Antwoord 12

Aangezien de tags alleen iOS zeggen, zal ik het antwoord voor Swift 1.2 en iOs 8.4 plaatsen, voeg deze toe aan je snelle klasse van viewcontroller:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    self.view.endEditing(true)
}
// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {
    textField.resignFirstResponder()
    return true
}
// MARK: -

Vergeet ook niet om UITextFieldDelegate toe te voegen aan de klassendeclaratie en zet je tekstvelden delegate op zichzelf (de weergave).


Antwoord 13

IN Swift 3

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

OF

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }

Antwoord 14

Eerst moet u het tekstveld delegete toevoegen in het .h-bestand. zo niet declareren
(BOOL)textFieldShouldReturn:(UITextField *)textFielddeze methode wordt niet aangeroepen. Dus voeg eerst een gemachtigde toe en schrijf toetsenbordverbergcode in die methode.

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

probeer deze eens..


Antwoord 15

Dus dit is wat ik deed om het te laten verdwijnen nadat ik de achtergrond had aangeraakt of was teruggekeerd. Ik moest de delegate = self in viewDidLoad toevoegen en vervolgens ook de delegate-methoden later in de .m-bestanden.

.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITextFieldDelegate>
@property (strong, atomic) UITextField *username;
@end
.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
@end

Antwoord 16

Gebruik dit gewoon in Objective-C om het toetsenbord te sluiten:

[[UIApplication sharedApplication].keyWindow endEditing:YES];

Antwoord 17

Gedelegeerde toevoegen: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

en voeg dan deze gedelegeerde methode toe

// Dit zou perfect moeten werken

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

Antwoord 18

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

wanneer u meer dan één tekstveld in het scherm gebruikt
Met deze methode hoef je niet elke keer tekstveld te vermelden zoals

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

Antwoord 19

Swift 2:

dit is wat er wordt gedaan om alles te doen!

toetsenbord sluiten met de knop Doneof Touch outSide,Nextaan om naar de volgende invoer te gaan.

Eerste TextFiled Return Keywijzigen in Nextin StoryBoard.

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2
  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}
func onTouchGesture(){
    self.view.endEditing(true)
}

Antwoord 20

Als u de huidige weergavecontroller of tekstweergave niet kent, kunt u de Responder Chain gebruiken:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)

Antwoord 21

voor snelle 3-4ik heb het opgelost zoals

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

kopieer en plak overal in de klas. Deze oplossing werkt alleen als je wilt dat alle UItextfield hetzelfde werken, of als je er maar één hebt!

Other episodes