2013-07-29 74 views
4

當你有多個UITextFields時可以關閉鍵盤嗎?如果是這樣如何?關閉帶有多個UITextFields的鍵盤?

作爲一個側面說明,我是否必須關閉每個字段和每個字段的鍵盤還是可以在全局範圍內完成?哦,如果我不需要觸摸DONE按鈕,它會超級酷,我理想上喜歡用戶觸摸任何東西的解決方案,但是有問題的領域和鍵盤自動消失...

哦如果你是如此友好的一步一步的指示。


我應該補充說,我有一個方法已經辭職鍵盤....

然而,我的表格提交時只運行! (請參閱下面的方法)

我的問題是如何鍵盤隱藏/解僱,而不必跳過這麼多該死的箍!你會想到6年後,一個成熟的操作系統將有一種方法來全球隱藏鍵盤....不!

好了,夠了嗚嗚....

- (void)hideKeyboard { 

[self.dancePlace resignFirstResponder]; 
[self.danceGate resignFirstResponder]; 
[self.danceTerminal resignFirstResponder]; 
[self.danceText resignFirstResponder]; 
[self.danceDate resignFirstResponder]; 
[self.danceStyle resignFirstResponder]; 
[self.danceTimeOut resignFirstResponder]; 

} 

我的按鈕提交時這個叫....

- (IBAction)addListingPressed:(id)sender { 

// NSLog(@"BUTTON PRESSED"); 

[self hideKeyboard]; 
[self valuesAdded]; 

} 

我的問題,假設任何人都可以回答這個...我懷疑不是,如果下列條件是MET,是否有辦法在全局隱藏鍵盤:1.)用戶輕觸任何一個現有字段的OUT,2.)按下屏幕上的任何其他位置。 3.)在現有viewcontroller.m文件中,不超過一行或兩行。 4.)我不必在視圖控制器上添加混淆按鈕。 (任何時候我必須添加插座,這個該死的東西正在撞擊我...然後發生了混亂,真的......記得我是只是初學者,它的讀取非常混亂,我必須把它放在這裏在這裏,那裏......哦,簡單的夥計,簡單,我不是在尋找優雅的解決方案,只是爲了它的工作

回答

0

是的,你只需要解僱它爲當前正在編輯。

爲了知道哪一個正在被編輯,你可以檢查-(BOOL)isFirstResponder屬性,如果它是第一響應者(被編輯的)將返回YES,如果不是,則返回NO。第一個響應者,你可以撥打-(void)resignFirstResponder那個擺脫的鍵盤。

舉例來說,如果你有一個名爲要關閉當前視圖控制器-(void)aMethod方法,你有textViews的數組稱爲textArray,你可以做一個小的循環,如:

-(void)aMethod { 
    for (UITextField *text in self.textArray) { 
     if ([text isFirstResponder]) [text resignFirstResponder]; 
     return; 
    } 
} 

這方式,你可以有一個可變數量的textFields,它仍然可以工作。

如果你只有一個或兩個文本框,你不希望創建一個數組對象,你可以這樣做(假設字段命名爲text1text2

-(void)aMethod { 
    if ([text1 isFirstResponder]) [text1 resignFirstResponder]; 
    else if([text2 isFirstResponder]) [text2 resignFirstResponder]; 
} 

此外,爲了使事情更容易你可以創建UIView的(這是我做的),一類方法將來獲得當前的第一個響應者,如果它存在的這種觀點的一個子視圖:

@implementation UIView (GetFirstResponder) 
- (UIView *)getFirstResponder { 
    if ([self isFirstResponder]) return self; 
    else { 
     for (UIView *subview in self.subviews) { 
      UIView *firstResponder = [subview getFirstResponder]; 
      if (firstResponder) return firstResponder; 
     } 
    } 
    return nil; 
} 

你可以把這個方法上的任何頂部文件,你想打電話它來自或創建一個單獨的文件並導入它。

一旦你有了這個方法,你可以撥打:

- (void)aMethod { 
    UIView *view = [self.view getFirstResponder]; 
    if (view) [view resignFirstResponder]; 
} 
+0

嗯,不完全清楚什麼去哪裏。記住,NEWBIE? (點自己)一步一步...但謝謝你的迴應。我很欣賞這種善意! – MagicMiles

+0

那麼,你會把它放在任何你想要關閉文本字段。例如,如果你有一個按鈕按鈕或手勢調用的方法,並且你想要關閉textField,那麼在該方法中,你可以添加如下內容:'if([text1 isFirstResponder])[text1 resignFirstResponder];'爲您的每個textFields。 – Jsdodgers

+0

我編輯了答案,添加了三種可以完成的方法的示例。我個人更喜歡這樣做的最後一種方法(最後2個代碼塊)。 – Jsdodgers

6

我有一個超類,我所有的視圖控制器繼承。在那個類中我有這個代碼。

MySuperViewController.h

#import <UIKit/UIKit.h> 

@interface MySuperViewController : UIViewController 
@property(strong, nonatomic) UITapGestureRecognizer *backgroundTapGestureRecognizer; 
@end 

MySuperViewController.m

- (void)viewDidLoad{ 
    //add a tap gesture recognizer to capture all tap events 
    //this will include tap events when a user clicks off of a textfield 
    self.backgroundTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onBackgroundTap:)]; 
    self.backgroundTapGestureRecognizer.numberOfTapsRequired = 1; 
    self.backgroundTapGestureRecognizer.cancelsTouchesInView = NO; 
    [self.view addGestureRecognizer:self.backgroundTapGestureRecognizer]; 
} 
- (void)onBackgroundTap:(id)sender{ 
    //when the tap gesture recognizer gets an event, it calls endEditing on the view controller's view 
    //this should dismiss the keyboard 
    [[self view] endEditing:YES]; 
} 

我有UITapGestureRecognizer作爲公共財產,所以如果我需要,我可以覆蓋它。

MyViewController.h

#import <UIKit/UIKit.h> 
#import "MySuperViewController.h"  


@interface MyViewController : MySuperViewController<UIGestureRecognizerDelegate> 
@end 

MyViewController.m

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

    //You don't always want the keyboard to be dismissed, so you tie into the gesture recognizer's delegate method 
    //By doing this, you can stop the endEditing call from being made 
    [self.backgroundTapGestureRecognizer setDelegate:self]; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    //touch.view is the view that recieved the touch 
    //if this view is another textfield or maybe a button, you can return NO and the endEditing call won't be made 
    if (touch.view == self.myViewThatShouldNotBeBlocked) { 
     return NO; 
    } 

    //if you want the gesture recognizer to accept the event, return yest 
    return YES; 
} 

我上傳一個例子項目github上。 https://github.com/JeffRegan/KeyboardBeGone

+0

謝謝@JeffCompton!那真是太好了。這將需要我一個星期decypher .... :-) – MagicMiles

+0

哈,我會添加評論 – JeffRegan

+2

這是迄今爲止最好的答案。你的第一個問題的關鍵是'[[self view] endEditing:YES];'無論哪個文本字段處於活動狀態,都會關閉鍵盤。 (有沒有必要找出它是哪一個!) – lnafziger

0

如果你不慣於做這麼多事情,只是想關閉鍵盤不是給IBOutlet中每個文本遞交到下述方法..

-(IBAction)hidekeyboard:(id)sender 
{ 
    [sender resignFirstResponder]; 
} 
0
[superview endEditing:YES]; // superview can be the view controller's view property. 
1

RDVKeyboardAvoiding是滾動視圖帶有輕擊手勢識別器,專爲多個textView/textFields設計。它跟蹤活動視圖並刪除大量樣板代碼。

1

任意位置點按文本字段外..它會隱藏它..

[self.view endEditing:YES]; 

還有幾個其他的方式來做到這一點。

[myEditField resignFirstResponder]; 
[myEditField endEditing]; 
[parentView endEditing]; 
+0

我認爲OP應該將此標記爲正確的答案。 – ToddB