Return tuşuna basıldığında klavye iOS programlı olarak nasıl kapatılır


105

ViewController'ın bir özelliğini UITextFieldprogramlı olarak oluşturdum UITextField. İade ve ekrana dokunma ile klavyeyi kapatmam gerekiyor. Kapatmak için ekrana dokunmayı başardım, ancak Return tuşuna basmak çalışmıyor.

Bunu storyboard'larla nasıl yapılacağını ve UITextFieldnesneyi bir özellik olarak oluşturmadan doğrudan tahsis edip başlatarak gördüm . Yapmak mümkün mü?

.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

Yanıtlar:


265

Basit yol, temsilcisini UITextFieldself ( self.mytestField.delegate = self) ' e bağlamak ve yöntemde klavyeyi textFieldShouldReturnkullanmaktan vazgeçmektir.[textField resignFirstResponder];

Klavyeyi kapatmanın başka bir yolu da şudur:

[self.view endEditing:YES];

[self.view endEditing:YES];Klavyeyi kapatmak istediğiniz yere koyun (Düğme olayı, Dokunma olayı, vb.).


Temsilciyi bağladığımda, yine de uyarılar ve / veya hatalar alıyorum. Daha önce yolunuzu görmüştüm, ancak bir nedenden dolayı işe yaramıyor.Bu yöntemler viewDidLoad'a girebilir mi?
noobsmcgoobs

1
TextField temsilcisini self olarak ayarlamaya çalıştığınızda hata alıyorsanız, muhtemelen sınıf tanımına UITextFieldDelegate'i eklememişsinizdir. Özellikle ... sınıf ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting

29

Bunun UITextFieldgibi bir temsilci yöntemi ekleyin :

@interface MyController : UIViewController <UITextFieldDelegate>

Ve textField.delegate = self;ardından iki temsilci yöntemi ekleyin.UITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

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

Yukarıdakilerin yalnızca denetleyiciniz UITextFieldDelegate'i şu şekilde @interface MyController : UIViewController <UITextFieldDelegate>
uygularsa çalıştığını eklemeliyiz

@iPatel Bu 2 yöntemi ekledim ve ayrıca self.username.delegate = self ve [self.username resignFirstResponder] 'i viewDidLoad'a ekledim. Bu, ihtiyacım olan her iki senaryo için de çalışıyor. Bu normal mi yoksa çok fazla kod mu kullanıyorum?
noobsmcgoobs

26

// Görünümde arka plana dokunarak keyBoard'u gizleyin

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

24

klavyeyi kapatmak için bunu hızlı bir şekilde kullanmanız yeterlidir:

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

Hızlı 3

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

SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff

17

SWIFT 4:

self.view.endEditing(true)

veya

Metin alanının temsilcisini geçerli görüntü denetleyicisine ayarlayın ve ardından:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Amaç-C:

[self.view endEditing:YES];

veya

Metin alanının temsilcisini geçerli görüntü denetleyicisine ayarlayın ve ardından:

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

    return YES;
}

9

Uygulama Temsilcisine yazabilirsiniz

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

bu şekilde kullanın, çok fazla kod yazamazsınız.


7

İOS görünüm hiyerarşisinde ilk yanıtlayanın ne olduğu hakkında bir fikir edinmeye çalışın. Metin alanınız becomeFirstResponder, içine dokunduğunuzda (veya mesajı programlı olarak ilettiğinizde) aktif hale geldiğinde (veya ilk yanıtlayıcı) , klavyeyi sunar. Bu nedenle, metin alanınızı ilk yanıtlayıcı olmaktan çıkarmak için, mesajı resignFirstResponderoraya iletmelisiniz.

[textField resignFirstResponder];

Klavyeyi dönüş düğmesinde gizlemek için, temsilci yöntemini uygulamalı textFieldShouldReturn:ve resignFirstRespondermesajı iletmelisiniz.

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

7

İşte kodumda kullandığım şey. Mucizevi şekilde çalışır!

Yourviewcontroller.h dosyasında şunu ekleyin:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Şimdi .m dosyasında, bunu ViewDidLoad işlevinize ekleyin:

- (void)viewDidLoad {
    [super viewDidLoad];

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

Ayrıca, bu işlevi .m dosyasına ekleyin:

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

1
sadece eylemi hatırlayın: @selector, sonlandırdığınız yerde aynı yöntem adını çağırmalı Düzenleme: EVET, bu durumda "handleSingleTap:"
Marcos Reboucas

4

Klavye açıldıktan sonra klavyeyi kapatmak için 2 durum vardır ,

  1. UITextField bir UIScrollView içindeyken

  2. UITextField bir UIScrollView dışındayken

2. UITextField bir UIScrollView dışında olduğunda, UIViewController alt sınıfınızdaki yöntemi geçersiz kılın

ayrıca tüm UITextView için temsilci eklemelisiniz

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. Bir de kaydırma görünümünde, dokunulduğunda dışında herhangi olayı olmaz bu yüzden bu durumda, bir Dokunma Jest Tanıyıcı kullanmak , Sürükle ve bir damla UITapGesture kaydırma görünümü için ve bunun için bir IBAction oluşturmak .

IBAction oluşturmak için ctrl tuşuna basın + UITapGesture'a tıklayın ve onu viewcontroller'ın .h dosyasına sürükleyin.

Burada eylem adım olarak tappedEvent adını verdim

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

Verilen bilgiler aşağıdaki bağlantıdan elde edilmiştir, lütfen daha fazla bilgi için bakın veya yukarıdaki verileri anlamıyorsanız benimle iletişime geçin.

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


Teşekkürler. Cevabınız bana yardımcı oldu ..!
Archit Kapoor

4

A UITextViewiçindeki bir grup s için ViewController:

Swift 3.0

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

Amaç-C

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


3

Etiketler sadece iOS yazdığından, Swift 1.2 ve iOs 8.4 için cevabı göndereceğim, bunları view controller swift sınıfınıza ekleyin:

// 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: -

Ayrıca, sınıf bildirimine UITextFieldDelegate eklemeyi ve metin alanlarınızı delegate olarak kendinize (görünüm) ayarlamayı unutmayın.


3

Swift 3'te

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

VEYA

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

2

İşte arka plana dokunduktan veya geri döndükten sonra onu yok etmek için yaptığım şey. ViewDidLoad'a delegate = self ve daha sonra .m dosyalarında delege yöntemlerini eklemem gerekiyordu.

.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

2

Klavyeyi kapatmak için bunu Objective-C'de kullanın:

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

1

Öncelikle .h dosyasına textfield delegete eklemeniz gerekir. eğer (BOOL)textFieldShouldReturn:(UITextField *)textFieldbu yöntemi çağırmazsanız, önce temsilci ekleyin ve bu yönteme klavye gizleme kodunu yazın.

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

bunu dene..


0

Temsilci Ekle: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

ve sonra bu temsilci yöntemini ekleyin

// Bu mükemmel çalışmalı

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

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

Ekranda birden fazla metin alanı kullandığınızda Bu yöntemle her seferinde metin alanından söz etmenize gerek yoktur.

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

Swift 2:

her şeyi yapmak için yapılan bu!

Doneveya tuşuyla klavyeyi kapatın Touch outSide, Nextsonraki girişe gitmek için.

İlk Değişim TextFiled Return Keyiçin Nextfilm şeridi içinde.

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)
}

0

Mevcut görünüm denetleyicisini veya metin görünümünü bilmiyorsanız, Yanıtlayıcı Zincirini kullanabilirsiniz:

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

0

hızlı 3-4 için düzelttim

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

sınıfta herhangi bir yere kopyalayıp yapıştırmanız yeterli. Bu çözüm, tüm UItextfield'ın aynı şekilde çalışmasını istiyorsanız veya yalnızca bir tanesine sahipseniz işe yarar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.