Cách dễ dàng để loại bỏ bàn phím?


377

Tôi có khá nhiều điều khiển nằm rải rác trong nhiều ô trong bảng và tôi tự hỏi liệu có cách nào dễ dàng hơn để loại bỏ bàn phím mà không phải lặp qua tất cả các điều khiển của tôi và từ bỏ tất cả chúng như là phản hồi đầu tiên. Tôi đoán câu hỏi là .. Làm thế nào tôi có thể trả lời đầu tiên hiện tại cho bàn phím?


bổ sung tốt cho câu hỏi này: stackoverflow.com/questions/1490573/ từ
ericsoco

Một cảnh báo cho tất cả các câu trả lời dưới đây. Nếu bạn thực hiện một sai sót ngay sau khi bạn từ chức KB, KB sẽ mồ côi và không thể bị loại bỏ. Bạn phải loại bỏ KB trong phương thức textFieldShouldReturn.
gjpc

26
sa thải toàn cầu bàn phím đúng cách:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Yerk

Tôi tìm thấy video này hữu ích Pinkstone.co.uk/ . Có lẽ nó có thể giúp đỡ người khác.
nhiệt tình

Câu trả lời:


797

Thử:

[self.view endEditing:YES];

1
Điều này dường như không hoạt động (thử nghiệm trên ios4.1). Mặc dù nó chỉ có sẵn trên iOS 3.2 trở lên. Tôi không chắc liệu điều này có thực sự được đảm bảo hay không, hoặc chỉ là tác dụng phụ không được bảo đảm từ việc gọi API theo cách mà nó không được ghi nhận để hoạt động.
JosephH

3
Điều này làm việc hoàn hảo cho tôi, và chắc chắn là thích hợp hơn với một số câu trả lời khác cho câu hỏi này. Các tài liệu nói rằng nó có sẵn trong iOS 2.0 trở lên.
antsyawn

8
Như tài liệu nói: "Phương pháp này xem chế độ xem hiện tại và phân cấp khung nhìn phụ của nó cho trường văn bản hiện đang là phản hồi đầu tiên. Nếu tìm thấy một, nó sẽ yêu cầu trường văn bản đó từ chức là phản hồi đầu tiên. Nếu tham số lực được đặt thành CÓ, trường văn bản thậm chí không bao giờ được yêu cầu; nó buộc phải từ chức. " - vì vậy đây là IMO câu trả lời chính xác cho câu hỏi ban đầu (trường hợp sử dụng: Tôi có một biểu mẫu với hàng triệu trường, tốt - mười ... hoặc hơn thế, và tôi cần phải loại bỏ bàn phím).
joshis

14
Câu trả lời không sai nhưng hơi sai, thực ra nó phải là: [self.view endEditing:YES];vì các giá trị BOOL là CÓ / KHÔNG trong Mục tiêu-C.
chrisben

24
chrisben: Bạn có thể sử dụng CÓ / KHÔNG, THẬT / SAI, 0/1.
Michael Superczynski

126

Bạn có thể buộc chế độ xem hiện đang chỉnh sửa từ bỏ trạng thái phản hồi đầu tiên của nó với [view endEditing:YES]. Điều này ẩn bàn phím.

Không giống như -[UIResponder resignFirstResponder], -[UIView endEditing:]sẽ tìm kiếm thông qua các cuộc phỏng vấn để tìm phản hồi đầu tiên hiện tại. Vì vậy, bạn có thể gửi nó đến chế độ xem cấp cao nhất của bạn (ví dụ: self.viewtrong a UIViewController) và nó sẽ thực hiện đúng.

(Câu trả lời này trước đây bao gồm một vài giải pháp khác, cũng có hiệu quả nhưng phức tạp hơn mức cần thiết. Tôi đã xóa chúng để tránh nhầm lẫn.)


Nhưng điều đó sẽ chỉ chặn thành phần trở thành FirstResponder, không xóa trạng thái FirstResponder hiện tại khỏi một phần tử.
Kendall Helmstetter Gelner

Ý tôi là trong việc ghi đè trở thànhFirstResponder để lưu trữ phần trả lời đầu tiên ở đâu đó, để nó có thể được truy cập (trong trường hợp này, đã từ chức) sau đó. Vấn đề cơ bản là Cốc Cốc không cung cấp cách hỏi cửa sổ hoặc xem phản hồi đầu tiên của nó là gì.
Nicholas Riley

+1 Thêm trở thành FirstFirstResponder đã giải quyết các vấn đề tôi gặp phải khi chạm vào các UITextField khác.
Jason George

3
Điều này đã lỗi thời. Câu [self.view endEditing:YES];trả lời là tốt hơn.
ftvs

1
Đây không phải là lỗi thời, câu trả lời này giải thích chính xác làm thế nào [UIView endediting:]hoạt động. Trong một trong những ứng dụng tôi đã phát triển, một hộp tìm kiếm đã được thêm vào trong UINavlationViewControll, nếu bạn chỉ gọi [self.view endEditing:YES], với tư cách là trình selfđiều khiển xem của bạn, điều này sẽ không hoạt động, thay vào đó, tôi đã gọi phương thức này trực tiếp trong phạm vi xem nơi hộp tìm kiếm được thêm vào, ví dụ: [self.mySearchBoxView endEditing:YES].
Tháng 1 Cássio

92

Bạn có thể gửi một hành động được nhắm mục tiêu đến ứng dụng, nó sẽ từ chức phản hồi đầu tiên bất cứ lúc nào mà không phải lo lắng về chế độ xem nào hiện có trạng thái phản hồi đầu tiên.

Mục tiêu-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)

Các hành động được nhắm mục tiêu của Nil là phổ biến trên Mac OS X cho các lệnh menu và đây là cách sử dụng chúng trên iOS.


14
Giải pháp tốt nhất của toàn bộ trang.
Leo Natan

Hoàn toàn là cách tốt nhất để thoát khỏi bàn phím từ mọi nơi trong ứng dụng iOS.
Ben Sinclair

Vẫn hoạt động với tôi trong iOS8. Trong ứng dụng của mình, tôi có một menu thanh bên và đôi khi trình điều khiển xem "trung tâm" hiển thị bàn phím. Và tôi muốn loại bỏ bàn phím nếu menu thanh bên sẽ hiển thị. Vì vậy, tôi đã thêm mã này vào menu thanh bên của tôi Phương thức viewWillAppear của Class.
Jenn đêm

1
Vẫn hoạt động trong iOS 9. Cách tuyệt vời để từ bỏ toàn cầu trọng tâm của một trường văn bản và loại bỏ bàn phím.
bmjohns 22/03/2016

Và để tiếp tục chuỗi nhận xét cụ thể này .... Vẫn hoạt động trong iOS 10 .:-)
Travelling Man

56

Thành thật mà nói, tôi không điên về bất kỳ giải pháp nào được đề xuất ở đây. Tôi đã tìm thấy một cách hay để sử dụng TapGestureRecognizer mà tôi nghĩ là vấn đề cốt lõi của bạn: Khi bạn nhấp vào bất cứ thứ gì ngoài bàn phím, hãy tắt bàn phím.

  1. Trong viewDidLoad, đăng ký để nhận thông báo bàn phím và tạo UITapGestureRecognizer:

    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. Thêm hiển thị bàn phím / ẩn người trả lời. Ở đó bạn thêm và xóa TapGestureRecognizer vào UIView sẽ tắt bàn phím khi gõ. Lưu ý: Bạn không phải thêm nó vào tất cả các chế độ xem hoặc điều khiển phụ.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
  3. TapGestureRecognizer sẽ gọi chức năng của bạn khi nó chạm và bạn có thể tắt bàn phím như thế này:

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

Điều hay ho của giải pháp này là nó chỉ lọc cho Vòi chứ không phải vuốt. Vì vậy, nếu bạn có nội dung cuộn phía trên bàn phím, các thao tác vuốt sẽ vẫn cuộn và để bàn phím hiển thị. Bằng cách loại bỏ trình nhận dạng cử chỉ sau khi bàn phím không còn, các thao tác trong tương lai trên chế độ xem của bạn sẽ được xử lý bình thường.


Trong @im THỰCation của tôi, tôi đã thêm @property (gán) UITapGestureRecognizer * tapRecognizer; và đã sửa đổi self.tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector (didTapAnywhere :)];
Giáo sư Todd

Tôi đang cố gắng làm một điều tương tự, và tôi không nhận được cuộc gọi lại trên máy. Tò mò: tại sao tài sản của bạn 'được giao'?
TahoeWolverine

Thêm một, và hơn nữa đây sẽ là hành vi mặc định của iOS. Hoặc ít nhất là thêm một cách đơn giản để chuyển nút loại bỏ.
Shaunti Fondrisi

24

Đây là một giải pháp để làm cho bàn phím biến mất khi nhấn returnvào bất kỳ trường văn bản nào , bằng cách thêm mã ở một nơi (vì vậy không phải thêm trình xử lý cho mỗi trường văn bản):


xem xét kịch bản này:

tôi có một viewcontrollervới hai trường văn bản (tên người dùng và mật khẩu). và giao thức viewcontrollerthực hiệnUITextFieldDelegate

tôi làm điều này trong viewDidLoad

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

và trình điều khiển khung nhìn thực hiện phương thức tùy chọn như

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

và không phân biệt trường văn bản bạn đang ở, ngay khi tôi nhấn returnvào bàn phím, nó sẽ bị loại bỏ!

Trong trường hợp của bạn, điều tương tự sẽ hoạt động miễn là bạn đặt tất cả đại biểu của trường văn bản thành tự và thực hiện textFieldShouldReturn


Vâng, tôi đã giải quyết được vấn đề, nhưng trong trường hợp của tôi, tôi muốn tự mình tắt bàn phím (bằng mã) và tôi không biết textField nào có trạng thái phản hồi đầu tiên.
Seventoes

1
Có những trường hợp khi bạn có thể muốn tắt bàn phím mà không nhấn "return", ví dụ như khi menu thanh bên sắp được hiển thị
Peter Johnson

Chỉnh sửa để làm rõ rằng câu trả lời này chỉ có liên quan trong các tình huống nhấn "trở lại" là một giải pháp chấp nhận được. [Trong trường hợp của tôi, tôi cũng muốn loại bỏ bàn phím khi người dùng chạm bên ngoài trường đang được chỉnh sửa; câu trả lời này không giúp được gì cho điều đó.]
ToolmakerSteve

14

Một cách tiếp cận tốt hơn là có một cái gì đó "đánh cắp" trạng thái phản hồi đầu tiên.

Vì UIApplication là một lớp con của UIResponder, bạn có thể thử:

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

Không làm được điều đó, hãy tạo một UITextField mới với khung có kích thước bằng 0, thêm nó vào một khung nhìn ở đâu đó và làm một cái gì đó tương tự (trở thành tiếp theo là từ chức).


1
Thủ thuật UIApplication không hoạt động (nó gặp sự cố, ít nhất là trên trình giả lập) nhưng bạn không cần UITextField có kích thước bằng không - chỉ cần chọn bất kỳ trường ngẫu nhiên nào và thực hiện điều này với nó. Trở thành FirstResponder của NSResponder là một phương thức chỉ thông báo, nhưng UIResponder thì không (thiết kế thực sự tệ hơn).
Nicholas Riley

1
Aha, cảm ơn! Nó gặp sự cố khi gọi nó trên UIApplication nhưng UITextField có kích thước bằng 0 hoạt động rất tốt và tôi không phải truy xuất bất kỳ trường nào trước đây.
Seventoes

Tại sao mọi người sẽ làm điều này nếu có một phương pháp chính thức, hoàn toàn tốt và được ghi lại cho việc này?
Maciej Swic

2
Họ sẽ không, xem câu trả lời được đánh giá cao nhất cho giải pháp tốt hơn. Nó chỉ không được biết đến nhiều vào thời điểm đó (câu trả lời của tôi là từ năm 2009, câu trả lời khác đến hơn một năm sau đó vào năm 2010). nhưng tôi để nó cho hậu thế.
Kendall Helmstetter Gelner

8

Tuck này đi trong một số lớp tiện ích.

+ (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
đây là những gì tôi đang tìm kiếm!
aslisabanci

Hoàn hảo, ngoại trừ bạn không cần phương thức globalResignFirstResponderRec, chỉ cần gọi [view endEditing: YES]. Nó làm điều tương tự.
n13

Vâng! Giải pháp cuối cùng! Tôi đã thử nhiều cách, chỉ có cách này hiệu quả với tôi! Cảm ơn rât nhiều!
douyw

6

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

Hoàn toàn rực rỡ!

Cảm ơn bạn.

Xem xét lời khuyên của bạn và lời khuyên của những người khác trong chủ đề này, đây là những gì tôi đã làm:

Nó trông như thế nào khi được sử dụng:

[[self appDelegate] dismissKeyboard]; (lưu ý: Tôi đã thêm appDelegate như một phần bổ sung cho NSObject để tôi có thể sử dụng mọi nơi trên mọi thứ)

Nó trông như thế nào dưới mui xe:

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

BIÊN TẬP

Sửa đổi câu trả lời của tôi để bao gồm tempTextField.enabled = NO;. Vô hiệu hóa trường văn bản sẽ ngăn UIKeyboardWillShowNotificationUIKeyboardWillHideNotificationthông báo bàn phím được gửi nếu bạn dựa vào các thông báo này trong ứng dụng của mình.


Tôi không biết nếu nó hoạt động, nhưng nó có vẻ là một cách thông minh và dễ dàng.
quỷ

5

Mẹo nhanh về cách loại bỏ bàn phím trong iOS khi người dùng chạm vào bất cứ nơi nào trên màn hình bên ngoài UITextField hoặc bàn phím. Xem xét bao nhiêu bất động sản bàn phím iOS có thể chiếm, có ý nghĩa để có một cách dễ dàng và trực quan cho người dùng của bạn để loại bỏ bàn phím.

Đây là một liên kết


Tuyệt quá! thêm vào AppDelegate làm cho nó hoạt động cho TẤT CẢ các chế độ xem liên quan.
Jiulong Zhao

5

Rất nhiều câu trả lời quá phức tạp ở đây, có lẽ bởi vì điều này không dễ tìm thấy trong tài liệu iOS. JosephH đã có nó ở trên:

[[view window] endEditing:YES];

4

Thậm chí đơn giản hơn câu trả lời của Meagar

ghi đè touchesBegan:withEvent:

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

Điều này sẽ dismiss the keyboardkhi bạn chạm vào bất cứ nơi nào trong background.


3

Đây là những gì tôi sử dụng trong mã của mình. Nó hoạt động như một say mê!

Trong yourviewcontroll.h thêm:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Bây giờ trong tệp .m, hãy thêm tệp này vào hàm ViewDidLoad của bạn:

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

Ngoài ra, thêm chức năng này trong tệp .m:

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

Cảm ơn! Nhưng bạn nên đổi tên chức năng thành 'didTapAnywhere' hoặc trình nhận dạng cử chỉ thành 'xử lýSingleTap' ;-)
Matthijs

2

Trong tệp tiêu đề của trình điều khiển xem của bạn thêm <UITextFieldDelegate>vào định nghĩa giao diện của trình điều khiển của bạn để nó phù hợp với giao thức đại biểu UITextField ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... Trong tệp triển khai của trình điều khiển (.m) thêm phương thức sau hoặc mã bên trong nó nếu bạn đã có phương thức viewDidLoad ...

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

... Sau đó, liên kết yourTextBox với trường văn bản thực tế của bạn

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

2

Bạn nên gửi endEditing:đến cửa sổ làm việc là lớp con củaUIView

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

Tôi cá là bạn có nghĩa là CÓ thay vào đó)
Matrosov Alexander

2

Cách tốt nhất để loại bỏ bàn phím khỏi UITableView và UIScrollView là:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

2

Trong swift 3 bạn có thể làm như sau

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

1

Câu trả lời của Jeremy không hoàn toàn phù hợp với tôi, tôi nghĩ bởi vì tôi có một ngăn xếp điều hướng trong chế độ xem tab với hộp thoại phương thức ở trên nó. Tôi đang sử dụng cách sau đây ngay bây giờ và nó đang hoạt động với tôi, nhưng số dặm của bạn có thể thay đổi.

 // 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 - tại sao bỏ phiếu xuống? Tôi đã giải quyết những thiếu sót trong thế giới thực cụ thể trong một câu trả lời khác với mã được kiểm tra. Tôi có thể hiểu việc thiếu phiếu bầu, nhưng bỏ phiếu cho tôi vào lãnh thổ tiêu cực là sự nản lòng thực sự. Tôi vẫn hy vọng câu trả lời trên giúp được người khác.
JJ Rohrer

1

Bạn cũng có thể cần ghi đè UIViewControll disablesAutomaticPalDismissal để làm việc này trong một số trường hợp. Điều này có thể phải được thực hiện trên UINavestionControll nếu bạn có.


1

Phân lớp trường văn bản của bạn ... và cả văn bản

Trong lớp con đặt mã này ..

-(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];
}

Trong các đại biểu trường văn bản (tương tự cho các đại biểu textview)

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


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

Tất cả được thiết lập .. Bây giờ chỉ cần đăng thông báo từ bất cứ nơi nào trong mã của bạn. Nó sẽ từ chức bất kỳ bàn phím.


1

Và trong nhanh chóng chúng ta có thể làm

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

Tôi không hiểu cách phản hồi đầu tiên hoạt động .. tôi phải đặt cái này ở đâu? trong quan điểm của tôi kiểm soát hoặc đại biểu?
Shaya C

Không quan trọng. Bạn có thể đặt nó bất cứ nơi nào bạn muốn. tức là hành động nút
Eike

1

Để tắt bàn phím sau khi bàn phím bật lên, có 2 trường hợp ,

  1. khi UITextField nằm trong UIScrollView

  2. khi UITextField nằm ngoài UIScrollView

2.Khi UITextField nằm ngoài UIScrollView ghi đè phương thức trong lớp con UIViewControll của bạn

bạn cũng phải thêm đại biểu cho tất cả UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. Trong chế độ xem cuộn, Khai thác bên ngoài sẽ không kích hoạt bất kỳ sự kiện nào , do đó, trong trường hợp đó, hãy sử dụng Trình nhận dạng cử chỉ , Kéo và thả UITapGesture cho chế độ xem cuộn và tạo IBAction cho nó .

để tạo IBAction, nhấn ctrl + nhấp vào UITapGesture và kéo nó vào tệp .h của trình điều khiển khung nhìn.

Ở đây tôi đã đặt tên tapsEvent là tên hành động của mình

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

abouve đưa ra Thông tin được lấy từ liên kết sau, vui lòng tham khảo để biết thêm thông tin hoặc liên hệ với tôi nếu bạn không hiểu dữ liệu abouve.

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


0

Tôi ghét rằng không có cách "toàn cầu" để lập trình loại bỏ bàn phím mà không sử dụng các lệnh gọi API riêng. Thường xuyên, tôi có nhu cầu loại bỏ bàn phím theo chương trình mà không biết đối tượng nào là người phản hồi đầu tiên. Tôi đã dùng đến việc kiểm tra selfsử dụng API thời gian chạy Objective-C, liệt kê tất cả các thuộc tính của nó, rút ​​ra những thuộc tính UITextFieldvà gửi resignFirstRespondertin nhắn cho chúng .

Không nên quá khó để làm điều này ...


0

Nó không đẹp, nhưng cách tôi từ chức Người phản hồi đầu tiên khi tôi không biết người phản hồi đó là gì:

Tạo một UITextField, bằng IB hoặc lập trình. Làm cho nó ẩn. Liên kết nó với mã của bạn nếu bạn thực hiện nó trong IB. Sau đó, khi bạn muốn tắt bàn phím, bạn chuyển phản hồi sang trường văn bản vô hình và ngay lập tức từ chức nó:

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

0

Bạn có thể lặp lại một cách đệ quy thông qua các cuộc phỏng vấn, lưu trữ một mảng của tất cả các UITextFields, sau đó lặp qua chúng và từ bỏ tất cả chúng.

Không thực sự là một giải pháp tuyệt vời, đặc biệt là nếu bạn có nhiều cuộc phỏng vấn, nhưng đối với các ứng dụng đơn giản, nó nên thực hiện thủ thuật.

Tôi đã giải quyết vấn đề này theo cách phức tạp hơn, nhưng hiệu quả hơn nhiều, nhưng bằng cách sử dụng một đơn vị / trình quản lý cho công cụ hoạt hình của ứng dụng của tôi và bất cứ khi nào một trường văn bản trở thành phản hồi, tôi sẽ chỉ định gán nó cho một tĩnh mà sẽ nhận được quét lên (từ chức) dựa trên một số sự kiện khác ... tôi gần như không thể giải thích trong một đoạn văn.

Hãy sáng tạo, tôi chỉ mất 10 phút để suy nghĩ về ứng dụng này sau khi tôi tìm thấy câu hỏi này.


Đã giải quyết trong vài tháng trước;) Tôi cuối cùng chỉ lưu trường hoạt động vào tiêu điểm và sử dụng nó.
Bảy mươi

0

Một phương pháp mạnh hơn một chút tôi cần sử dụng gần đây:

- (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];
}

Tôi thấy một số phương pháp "toàn cầu" khác không hoạt động (ví dụ: UIWebView& WKWebViewtừ chối từ chức).


0

Thêm một công cụ nhận dạng cử chỉ vào chế độ xem của bạn. Và xác định nó

tập tin .m của bạn sẽ như thế nào

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

Nó làm việc cho tôi


0

Có, endEditing là lựa chọn tốt nhất. Và từ iOW 7.0, UIScrollViewcó một tính năng thú vị để loại bỏ bàn phím khi tương tác với chế độ xem cuộn. Để đạt được điều này, bạn có thể đặt keyboardDismissModethuộc tính của UIScrollView.

Đặt chế độ loại bỏ bàn phím là:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Nó có vài loại khác. Có một cái nhìn vào tài liệu táo này .



0

cách dễ dàng là gọi phương thức

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

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

Bạn không cần 'nếu' ở đó, từ chứcFirstResponder sẽ làm điều đó bằng mọi cách. Có lẽ bạn có nghĩa là - (BOOL) canResignFirstResponder?
Bảy mươi

0

Bạn phải sử dụng một trong những phương pháp này,

[self.view endEditing:YES];

hoặc là

[self.textField resignFirstResponder];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.