2010-05-13 32 views
48

Đây có lẽ là một câu hỏi ngớ ngẩn, nhưng tôi không thể tìm thấy câu trả lời trong tài liệu. Nút "Xong" trên bàn phím bật lên có luôn khiến bàn phím biến mất không? Tôi thấy rất nhiều mã khắp nơi trên web như thế này:Bàn phím iPhone, nút Xong và từ chứcFirstResponder

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

Khi tôi nhấn nút "Done", bàn phím bật xuống và UITextField từ chức responder đầu tiên.

Tôi giả sử rằng nhấn nút "Xong" không được sử dụng để gây ra một UITextField đến resignFirstResponder, nhưng hành vi đó đã thay đổi tại một thời điểm.

tôi gỡ lỗi trên OS 3.0 - 3.1.3

+1

Xem https://developer.apple.com/library/ios/#documentation/iphone/conceptual/iPhone101/Articles/05_ConfiguringView.html –

+1

Rõ ràng tôi don' t có đủ đại diện để chỉ cần thêm một bình luận cho câu trả lời của nevan vua, vì vậy tôi sẽ đề cập đến ở đây rằng đối với giải pháp của mình nó không cần thiết để làm cho lớp một UITextFieldDelegate. Giao thức UITextFieldDelegate chỉ định nghĩa một số thông báo được gửi đến đại biểu hỏi liệu trường text có nên từ chức không, nó đã từ chức ... Bất kỳ đối tượng nào cũng có thể nhận hành động theo cách câu trả lời của anh ta được thực hiện đơn giản bằng cách xác định phương thức của họ theo cách mà anh ta đã làm với textFieldFinished. –

Trả lời

89

tôi đã thực hiện một dự án thử nghiệm nhỏ với chỉ một UITextField và mã này

#import <UIKit/UIKit.h> 
@interface TextFieldTestViewController : UIViewController 
<UITextFieldDelegate> 
{ 
    UITextField *textField; 
} 
@property (nonatomic, retain) IBOutlet UITextField *textField; 
@end 

#import "TextFieldTestViewController.h" 
@implementation TextFieldTestViewController 
@synthesize textField; 

- (void)viewDidLoad 
{ 
    [self.textField setDelegate:self]; 
    [self.textField setReturnKeyType:UIReturnKeyDone]; 
    [self.textField addTarget:self 
        action:@selector(textFieldFinished:) 
     forControlEvents:UIControlEventEditingDidEndOnExit]; 
    [super viewDidLoad]; 
} 
- (IBAction)textFieldFinished:(id)sender 
{ 
    // [sender resignFirstResponder]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

Các lĩnh vực văn bản là một chưa sửa đổi UITextField kéo vào NIB, với ổ cắm kết nối.
Sau khi tải ứng dụng, nhấp vào trường văn bản sẽ trả về bàn phím. Nhấn nút "Xong" làm cho trường văn bản mất tập trung và làm động ra bàn phím. Lưu ý rằng lời khuyên trên web là luôn sử dụng [sender resignFirstResponder] nhưng lời khuyên này không hoạt động.

+0

Hmm. Và những gì addTarget: action: forControlEvents: for? Không phải là setDelegate: đủ? Hãy để tôi thử nó một mình. – bealex

+0

Vâng, chính xác. Nếu bạn sẽ xóa addTarget:… call, mọi thứ sẽ ổn. – bealex

+1

Đối với các noobs như tôi, cách để làm điều này với trình tạo giao diện là kéo + từ "Đã kết thúc khi thoát" đến chủ sở hữu của tệp và sau đó gán nó cho IBAction không có gì (textFieldFinished: (id) người gửi trong này thí dụ). Câu trả lời ở trên là chính xác, chỉ muốn thêm vào nó. –

6

Từ các tài liệu (mọi phiên bản):

Đó là trách nhiệm của ứng dụng của bạn để bỏ qua những bàn phím tại thời điểm lựa chọn của bạn . Bạn có thể loại bỏ bàn phím theo trả lời cho một hành động cụ thể của người dùng, chẳng hạn như người dùng nhấn vào nút cụ thể trong giao diện người dùng của bạn. Bạn cũng có thể định cấu hình ủy nhiệm trường văn bản của bạn thành loại bỏ bàn phím khi người dùng nhấn phím "trả lại" trên chính bàn phím . Để loại bỏ bàn phím , hãy gửi thông báo từ chứcĐiều chỉnh phản hồi trước tiên tới trường văn bản hiện là trả lời tự động đầu tiên. Làm như vậy sẽ khiến đối tượng trường văn bản kết thúc phiên chỉnh sửa hiện tại (với sự đồng ý của đại biểu ) và ẩn bàn phím .

Vì vậy, bạn phải gửi lại từ chốiFirstResponder bằng cách nào đó. Nhưng có một khả năng là textfield mất tập trung theo cách khác trong quá trình xử lý textFieldShouldReturn: message. Điều này cũng sẽ khiến bàn phím biến mất.

+0

Cảm ơn câu trả lời. Tôi tìm thấy phần gây ra 'UITextField' để từ bỏ trả lời đầu tiên. Tôi có một cuộc gọi '\t [textField addTarget: tự hành động: @selector (textFieldDone :) forControlEvents: UIControlEventEditingDidEndOnExit] '. Kỳ lạ thay, phương thức 'textFieldDone:' trống (tôi đã xóa cuộc gọi 'resignFirstResponder'). Vì vậy, tôi vẫn không thể hiểu tại sao bàn phím biến mất. –

+0

Có lẽ bạn di chuyển tiêu điểm đến một thành phần khác ngầm? Bằng cách thay đổi một số giá trị trong một bảng hoặc một nhãn chẳng hạn? – bealex

+0

Tôi không nghĩ vậy có điều gì khác đang diễn ra. Tôi đã tạo một dự án nhỏ (đăng mã bên dưới) và nó mang lại hành vi tương tự. Không thực sự chắc chắn lý do tại sao nó xảy ra. –

2

Một dòng mã cho nút Done: -

[yourTextField setReturnKeyType:UIReturnKeyDone]; 

Và thêm phương pháp hành động trên valueChanged của TextField và thêm này line-

[yourTextField resignFirstResponder]; 
13

Trong Xcode 5.1

Enable nút Done

  • Trong Attributes Inspector cho UITextField trong Storyboard tìm ra lĩnh vực "Return Key" và chọn "Done"

Hide Keyboard khi Done được nhấn

  • Trong bảng phân cảnh làm cho ViewController của bạn, đại biểu cho UITextField
  • Thêm phương pháp này để ViewController bạn

    -(BOOL)textFieldShouldReturn:(UITextField *)textField 
    { 
        [textField resignFirstResponder]; 
        return YES; 
    } 
    
Các vấn đề liên quan