Klavyeyi kapatmanın kolay yolu?


377

Masamdaki birçok tablo hücresine dağılmış birkaç kontrolüm var ve tüm kontrollerim arasında dolaşmak ve hepsini ilk yanıtlayıcı olarak istifa etmeden klavyeyi kapatmanın daha kolay bir yolu olup olmadığını merak ediyordum. Sanırım soru şu: Geçerli ilk cevaplayıcıyı klavyeye nasıl alabilirim?


bu soru için güzel bir tamamlayıcı: stackoverflow.com/questions/1490573/…
ericsoco

Aşağıdaki cevaplara bir uyarı. KB'den istifa ettikten hemen sonra bir segue yaparsanız, KB artık yetim kalır ve reddedilemez. KB'yi textFieldShouldReturn yönteminde kapatmalısınız.
gjpc

26
küresel klavye doğru şekilde işten çıkarılma:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Yerk

Bu videoyu yararlı buldum pinkstone.co.uk/… . Belki başkalarına yardım edebilir.
enthusiasticgeek

Yanıtlar:


797

Deneyin:

[self.view endEditing:YES];

1
Bu işe yarıyor gibi görünüyor (ios4.1'de test edildi). Yine de yalnızca iOS 3.2'de kullanılabilir. Bunun gerçekten çalışacağının garanti edilip edilmediğinden emin değilim veya çalışmak için belgelenmemiş bir şekilde bir API'yi çağırmanın garanti edilmeyen bir yan etkisi olup olmadığından emin değilim.
JosephH

3
Bu benim için mükemmel çalıştı ve bu sorunun diğer cevaplarından kesinlikle tercih edilebilir. Dokümanlar, iOS 2.0 ve sonraki sürümlerinde kullanılabilir olduğunu söylüyor.
Aralık'ta antsyawn

8
Belgelerin dediği gibi: "Bu yöntem geçerli görünümü ve o anda ilk yanıtlayıcı olan metin alanı için alt görünüm hiyerarşisini inceler. Birini bulursa, bu metin alanının ilk yanıtlayıcı olarak istifa etmesini ister. Force parametresi ayarlanmışsa EVET'e göre, metin alanı hiçbir zaman sorulmaz; istifaya zorlanır. " - bu IMO'nun orijinal soruya doğru cevabı (kullanım örneği: milyonlarca alana sahip bir formum var - on ... ya da öylesine, ve klavyeyi kapatmam gerekiyor).
joshis19

14
Cevap yanlış değil ama biraz yanlış, aslında şöyle olmalı: [self.view endEditing:YES];BOOL değerleri Objective-C'de YES / NO.
chrisben

24
chrisben: EVET / HAYIR, DOĞRU / YANLIŞ, 0/1 kullanabilirsiniz.
Michael Superczynski

126

Şu anda düzenlenmekte olan görünümü ile ilk yanıtlayıcı durumunu istifa etmeye zorlayabilirsiniz [view endEditing:YES]. Bu klavyeyi gizler.

Bunun aksine -[UIResponder resignFirstResponder], -[UIView endEditing:]geçerli ilk yanıtlayıcıyı bulmak için alt görünümlerde arama yapar. Eğer (örneğin üst düzey görünümüne gönderebilirsiniz Yani self.viewbir UIViewController) ve doğru olanı yapacağız.

(Bu cevap daha önce işe yarayan ancak gerekenden daha karmaşık olan birkaç başka çözümü içeriyordu. Karışıklığı önlemek için bunları kaldırdım.)


Ancak bu yalnızca bileşenin firstResponder olmasını engeller, geçerli firstResponder durumunu bir öğeden kaldırmaz.
Kendall Helmstetter Gelner

Geçersiz kılmayı kastettiğim, ilk yanıtlayıcıyı bir yerde saklamak için haline geldi.Bu yüzden daha sonra erişilebilir (bu durumda istifa). Temel sorun, Cocoa Touch'ın bir pencereyi sormanın veya ilk yanıtlayıcının ne olduğunu görmenin bir yolunu sağlamamasıdır.
Nicholas Riley

+1 ekleyerek halineFirstResponder diğer UITextFields üzerinde musluklar ile yaşadım sorunları çözüldü.
Jason George

3
Bu kullanılmıyor. [self.view endEditing:YES];Cevap iyidir.
ftvs

1
Bu eski değil, bu cevap tam olarak nasıl [UIView endediting:]çalıştığını açıklıyor . Geliştirdiğim uygulamalardan birinde, UINavigationViewController'da bir arama kutusu eklendi, sadece görünüm denetleyiciniz [self.view endEditing:YES]olarak çağırırsanız self, bu işe yaramaz, bunun yerine, arama yönteminin eklendiği görünüm kapsamında bu yöntemi doğrudan çağırdım, örnek: [self.mySearchBoxView endEditing:YES].
Jan Cássio

92

Uygulamaya sıfır hedefli bir eylem gönderebilirsiniz, şu anda hangi görünümün ilk yanıtlayıcı durumuna sahip olduğu konusunda endişelenmenize gerek kalmadan ilk yanıtlayıcıyı istediği zaman istifa eder.

Objective-C:

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

Swift 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Nil hedefli eylemler menü komutları için Mac OS X'te yaygındır ve işte bunlar iOS için bir kullanım alanıdır.


14
Tüm sayfanın en iyi çözümü.
Leo Natan

İOS uygulamasında herhangi bir yerden klavyeden kurtulmanın kesinlikle en iyi yolu.
Ben Sinclair

Hala iOS8'de benim için çalışıyor. Uygulamamda bir yan çubuk menüsü var ve "orta" görünüm denetleyicisinin klavyeyi gösterdiği zamanlar var. Yan çubuk menüsü görünecekse klavyeyi kapatmak istiyorum. Bu yüzden yan çubuğum Class 'viewWillAppear yöntemine bu kodu ekledim.
Jenn Eve

1
Hala iOS 9'da çalışıyor. Bir metin alanının odağını küresel olarak istifa etmenin ve klavyeyi kapatmanın harika bir yolu.
16:48, bmjohns

Ve bu özel yorumlama çizgisine devam etmek için .... Hala iOS 10'da çalışıyor. :-)
Travelling Man

56

Dürüst olmak gerekirse, burada önerilen çözümlerin hiçbiri için deli değilim. Sorununuzun kalbine geldiğini düşündüğüm bir TapGestureRecognizer kullanmanın güzel bir yolunu buldum: Klavyenin dışında bir şeye tıkladığınızda klavyeyi kapatın.

  1. ViewDidLoad'da klavye bildirimlerini almak için kaydolun ve bir UITapGestureRecognizer oluşturun:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
  2. Yanıtlayanlara klavye gösterisi / gizleme ekleyin. Burada, dokunulduğunda klavyeyi kapatması gereken UIView'a TapGestureRecognizer'ı ekler ve kaldırırsınız. Not: Tüm alt görünümlere veya kontrollere eklemeniz gerekmez.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
  3. TapGestureRecognizer, dokunduğunda işlevinizi arayacak ve klavyeyi şu şekilde kapatabilirsiniz:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }

Bu çözümün güzel yanı, sadece tıklamalar için filtreler olması, tokatlamak değil. Bu nedenle, klavyenin üzerinde kaydırma içeriğiniz varsa, hızlıca kaydırma hareketleri klavyeyi göstermeye devam eder. Klavye gittikten sonra hareket algılayıcıyı kaldırarak, görünümünüzde ilerideki dokunuşlar normal şekilde işlenir.


@Uygulamama @property (atama) ekledim UITapGestureRecognizer * tapRecognizer; ve değiştirilmiş self.tapRecognizer = [[UITapGestureRecognizer ayır] initWithTarget: self action: @selector (didTapAnywhere :)];
Profesör Todd

Benzer bir şey yapmaya çalışıyorum ve geri aramayı dokunmuyorum. Meraklı: Mülkünüz neden 'atadı'?
TahoeWolverine

Artı bir, ve ayrıca bu varsayılan iOS davranışı olmalıdır. Ya da en azından bir kapatma düğmesine geçiş yapmak için basit bir yol ekleyin.
Shaunti Fondrisi

24

Bu, isabetli zaman Klavyenin ekrandan kaybolması için bir çözümdür returniçinde herhangi bir yerde kod ekleyerek metin alanına, (böylece her metin alanına bir işleyici eklemek zorunda değilsiniz):


şu senaryoyu inceleyin:

i viewcontrolleriki textfields (kullanıcı adı ve şifre) ile var. ve viewcontrolleruygulama UITextFieldDelegateprotokolü

bunu viewDidLoad içinde yaparım

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

ve viewcontroller isteğe bağlı yöntemi şu şekilde uygular:

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

ve bulunduğunuz metin alanına bakılmaksızın return, klavyeden vurur vurmaz işten çıkarılır !

Sizin durumunuzda, tüm metin alanı temsilcisini kendinize ayarladığınız ve uyguladığınız sürece aynı şey işe yarayacaktır. textFieldShouldReturn


Sorun zaten çözüldü, ama benim durumumda klavyeyi kendi kendime (kodda) kapatmak istedim ve hangi textField'in ilk yanıtlayıcı durumuna sahip olduğunu bilmiyordum.
Seventoes

1
"Dönüş" tuşuna basmadan klavyeyi kapatmak isteyebileceğiniz durumlar olabilir, örneğin bir kenar çubuğu menüsü görüntülenmek üzere olduğunda
Peter Johnson

Bu cevabın yalnızca "geri dönüş" e basmanın kabul edilebilir bir çözüm olduğu durumlarda geçerli olduğunu açıklığa kavuşturmak için düzenlenmiştir . [Benim durumumda, kullanıcı düzenlenmekte olan alanın dışına dokunduğunda da klavyeyi kapatmak istedim; bu cevap bu konuda yardımcı olmuyor.]
ToolmakerSteve

14

Daha iyi bir yaklaşım, ilk cevaplayıcı statüsünü "çalmak "tır.

UIApplication, bir UIResponder alt sınıfı olduğundan, şunları deneyebilirsiniz:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

Başarısız olursa, sıfır boyutlu bir çerçeveye sahip yeni bir UITextField oluşturun, bir yere bir görünüme ekleyin ve benzer bir şey yapın (ardından istifaya başlayın).


1
UIApplication hile çalışmıyor (en azından simülatörde çöküyor), ancak sıfır boyutlu bir UITextField'a ihtiyacınız yok - herhangi bir rastgele alan seçin ve bunu onunla yapın. NSResponder'ın becameFirstResponder yalnızca bir bildirim yöntemidir, ancak UIResponder'ın değil (tasarım aslında daha kötüdür).
Nicholas Riley

1
Aha, teşekkürler! UIApplication üzerinde çağıran çöküyor ama sıfır boyutlu UITextField harika çalışıyor ve önceki alanlardan hiçbirini almak zorunda değilim.
Seventoes

Bunun için resmi, mükemmel derecede iyi ve belgelenmiş bir yöntem varsa neden herkes bunu yapsın?
Maciej Swic

2
Daha iyi bir çözüm için en çok onaylanmış cevabı görmezlerdi. O zamanlar tam olarak bilinmiyordu (cevabım 2009'dan geliyordu, diğer cevap 2010'da bir yıldan fazla geldi). ama ben gelecek nesiller için bırakıyorum.
Kendall Helmstetter Gelner

8

Bunu bazı yardımcı program sınıflarında saklayın.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}

1
Aradığım şey buydu!
aslisabanci

Mükemmel, globalResignFirstResponderRec yöntemine ihtiyacınız olmadığı sürece bunun yerine [view endEditing: YES] öğesini çağırmanız yeterlidir. Aynı şeyi yapar.
n13

Evet! Son çözüm! Birçok yol denedim, sadece bu benim için çalışıyor! Çok teşekkür ederim!
douyw

6

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

Kesinlikle harika!

Teşekkür ederim.

Tavsiyenizi ve bu konudaki diğerlerinin tavsiyelerini göz önünde bulundurarak, yaptığım şey bu:

Kullanıldığında neye benziyor:

[[self appDelegate] dismissKeyboard]; (not: AppDelegate'i NSObject'e ek olarak ekledim, böylece herhangi bir yerde herhangi bir yerde kullanabilirim)

Kaputun altında neye benziyor:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

DÜZENLE

Cevabımda değişiklik dahil tempTextField.enabled = NO;. Metin alanını devre dışı bırakılması önleyecektir UIKeyboardWillShowNotificationve UIKeyboardWillHideNotificationgönderilmesini klavye bildirimleri uygulamanıza boyunca bu bildirimlerin güvenmek gerekir.


çalışıp çalışmadığını bilmiyorum, ama akıllı ve kolay bir yol gibi görünüyor.
iblis

5

Bir kullanıcı ekranda UITextField veya klavye dışında herhangi bir yere dokunduğunda iOS'ta klavyenin nasıl kapatılacağı hakkında hızlı ipucu. İOS klavyesinin ne kadar emlak alabileceği göz önüne alındığında, kullanıcılarınızın klavyeyi kapatması için kolay ve sezgisel bir yol olması mantıklıdır.

İşte bir bağlantı


Harika! AppDelegate'e ekleyerek, TÜM ilgili görünümler için çalışmasını sağlar.
Jiulong Zhao

5

Belki de iOS belgelerinde bulmak kolay olmadığından, burada çok fazla karmaşık cevap var. JosephH'ın hemen üzerinde vardı:

[[view window] endEditing:YES];

4

Meagar'ın cevabından bile daha basit

üzerine yazma touchesBegan:withEvent:

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

Bu, dismiss the keyboardiçindeki herhangi bir yere dokunduğunuzda olur background.


3

İşte benim kodda ne kullanıyorum. Mucizevi şekilde çalışır!

Yourviewcontroller.h dosyasına ekleyin:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

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

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

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

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

Teşekkürler! Ancak, işlevi 'didTapAnywhere' olarak veya jest tanıtıcısını 'handleSingleTap' ;-) olarak değiştirmelisiniz
Matthijs

2

Görünüm denetleyicinizin başlık dosyasında <UITextFieldDelegate>, denetleyicinizin arabiriminin tanımına UITextField delege protokolüne uyması için ekleyin ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... Denetleyicinin uygulama dosyasına (.m) aşağıdaki yöntemi veya zaten bir viewDidLoad yönteminiz varsa içindeki kodu ekleyin ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... Ardından Metin Kutunuzu gerçek metin alanınıza bağlayın

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}

2

endEditing:Alt sınıf olan çalışma penceresine göndermelisinizUIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];

Bahse girerim bunun yerine EVET demek
istediniz

2

Klavyeyi UITableView ve UIScrollView'dan çıkarmanın en iyi yolu:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

2

Hızlı 3'te aşağıdakileri yapabilirsiniz

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

1

Jeremy'nin yanıtı benim için pek işe yaramadı, bence sekme görünümünde üst kısmında kalıcı bir iletişim kutusu olan bir gezinme yığını vardı. Şu anda aşağıdakileri kullanıyorum ve benim için çalışıyor, ancak kilometreniz değişebilir.

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}

Hmm - neden aşağı oy? Test edilmiş kodla başka bir cevapta gerçek dünyadaki eksiklikleri giderdim. Oyların eksikliğini anlayabiliyorum, ancak beni olumsuz bölgeye oylamak gerçek cesaret kırıcılığı. Umarım yukarıdaki cevap başka birine yardımcı olur.
JJ Rohrer

1

Ayrıca, bazı durumlarda bunun çalışması için UIViewController devre dışı bırakmalarını otomatik klavyeyi geçersiz kılmanız gerekebilir. Bu, varsa UINavigationController üzerinde yapılması gerekebilir.


1

Metin alanlarınızı alt sınıflara ayırın ... ve ayrıca metin görünümleri

Alt sınıfta bu kodu yazınız ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

Metin alanı delegelerinde (benzer şekilde metin görüntüleme delegeleri için)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

Her şey hazır .. Şimdi sadece kodunuzun herhangi bir yerinden bildirim gönderin. Herhangi bir klavyeden istifa eder.


1

Ve çabucak yapabiliriz

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

İlk cevaplayıcının nasıl çalıştığını anlamıyorum .. bunu nereye koyabilirim? benim görünüm denetleyicim veya temsilci?
Shayan C

Önemli değil. İstediğiniz yere koyabilirsiniz. yani düğme eylemi
Eike

1

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

  1. UITextField bir UIScrollView içinde olduğunda

  2. UITextField bir UIScrollView dışında olduğunda

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

ayrıca tüm UITextView için temsilci eklemeniz gerekir

- (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şlarına basın ve UITapGesture'a tıklayın ve viewcontroller'ın .h dosyasına sürükleyin.

Burada tappedEvent adını eylem adım olarak adlandırdım

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

Yukarıda verilen bilgiler aşağıdaki linkten türetilmiştir, daha fazla bilgi için lütfen yukarıdaki verileri anlamıyorsanız veya benimle iletişime geçin.

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


0

Özel API çağrıları kullanmadan klavyeyi programlı olarak kapatmanın "küresel" bir yolu olmadığından nefret ediyorum. Sıklıkla, ilk yanıt veren nesnenin ne olduğunu bilmeden klavyeyi programlı olarak kapatmaya ihtiyacım var. Ben selfObjective-C çalışma zamanı API kullanarak incelemek için başvurdu , tüm özellikleri üzerinde numaralandırma, türü olanlar çekerek UITextFieldve onları göndermekresignFirstResponder mesaj .

Bunu yapmak bu kadar zor olmamalı ...


0

Güzel değil, ama cevaplayıcının ne olduğunu bilmediğimde firstResponder'ı istifa etmenin yolu:

IB veya programlı olarak bir UITextField oluşturun. Gizli yap. IB'de yaptıysanız kodunuza bağlayın. Ardından, klavyeyi kapatmak istediğinizde, yanıtlayıcıyı görünmez metin alanına geçirir ve hemen istifa edersiniz:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

0

Alt görünümler arasında yinelemeli olarak yineleme yapabilir, tüm UITextField'lerin bir dizisini depolayabilir ve sonra bunların arasında döngü yapıp hepsini istifa edebilirsiniz.

Gerçekten harika bir çözüm değil, özellikle çok sayıda alt görünümünüz varsa, ancak basit uygulamalar için hile yapmalıdır.

Bunu çok daha karmaşık ama çok daha performanslı bir şekilde çözdüm, ancak uygulamamın animasyon motoru için tek birton / yönetici kullanarak ve bir metin alanı cevaplayıcı olduğunda, bunu alacak bir statike atayacağım diğer olaylara dayanarak süpürüldü (istifa etti) ... bir paragrafta açıklamak neredeyse imkansız.

Yaratıcı olun, bu soruyu bulduktan sonra uygulamam için bunu düşünmek sadece 10 dakika sürdü.


Bu ay önce çözüldü;) Ben sadece aktif alan odaklanarak kaydetmek ve bunu kullanarak sona erdi.
Seventoes

0

Son zamanlarda kullanmam gereken biraz daha sağlam bir yöntem:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Ben öteki "küresel" yöntemlerden bazıları işe yaramadı bulundu (örneğin, UIWebView& WKWebViewistifa etmeyi reddetti).


0

Görünümünüze Bir Dokunma Hareket Tanıyıcı ekleyin ve bunu tanımlayın

.m dosyanız

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Benim için çalıştı


0

Evet, endEditing en iyi seçenektir. Ve iOW 7.0'dan, UIScrollViewkaydırma görünümü ile etkileşimde klavyeyi kapatmak için harika bir özelliği vardır. Bunu başarmak için, keyboardDismissModeözelliğini ayarlayabilirsiniz UIScrollView.

Klavye kapatma modunu şu şekilde ayarlayın:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Birkaç türü daha vardır. Bu elma belgesine bir göz atın .



0

en kolay yol yöntemi çağırmaktır

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}

Orada 'if' yapmanıza gerek yok, resignFirstResponder zaten her şeyi yapacak. Belki demek istedin - (BOOL) canResignFirstResponder?
Seventoes

0

Bu yöntemlerden birini kullanmalısınız,

[self.view endEditing:YES];

veya

[self.textField resignFirstResponder];
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.