2011-12-04 15 views
15

Tôi có chế độ xem bảng trong bảng biểu mẫu (iPad) và một trong các ô chứa UITextField. Trình điều khiển xem của tôi giữ một tham chiếu đến trường văn bản và cũng là đại biểu của nó.Bàn phím của UITextField sẽ không loại bỏ. Không, thực sự

Khi trường văn bản truy cập Quay lại, tôi cho nó biết -resignFirstResponder bên trong số -textFieldShouldReturn:. Trong trường hợp khác, tôi muốn ép nó kết thúc chỉnh sửa, vì vậy tôi nói toàn bộ bảng xem -endEditing:YES. Sau đó, tôi phát hành tham chiếu cục bộ của mình vào trường văn bản và tải lại hàng để thay thế bằng một thứ khác.

Bàn phím sẽ không biến mất trong cả hai trường hợp. Tôi không biết có gì sai, và tôi không chắc chắn làm thế nào để gỡ lỗi thêm. Tôi chưa bao giờ gặp vấn đề bàn phím dính với bất kỳ chỉnh sửa văn bản nào khác mà tôi đã thực hiện-- việc từ chức firstResponder luôn hoạt động như mong đợi.

Mọi suy nghĩ? Cảm ơn.

+0

Mã của bạn có chạy không? Bạn có gọi resignFirstResponder trên trường văn bản chính xác không? – Eiko

+0

Vâng. Tôi đảm bảo rằng 'isFirstResponder' là YES trên textField mà tôi gọi là' -resignFirstResponder' ngay trước khi tôi gọi nó. –

Trả lời

11

Triển khai -disablesAutomaticKeyboardDismissal và trả lại NO. Nó hiện hoạt động trên iOS 6, nhưng bạn phải triển khai nó trong bộ điều khiển phù hợp. Nếu bạn có một bảng điều khiển định dạng biểu mẫu phương thức với một bộ điều khiển con có trường văn bản, đó là bộ điều khiển điều hướng cần triển khai phương thức, không phải là con.

(Xem thêm Dismiss keyboard on IPAD)

+0

Ồ vâng! Cuối cùng giải quyết điều này cho tôi. Hãy nhớ để thiết lập điều này trong bộ điều khiển xem trình bày bộ điều khiển xem có chứa trường văn bản. –

21

Các tài liệu của Apple describe this exception:

Trên iPad, nếu một modally điểm điều khiển trình bày quan điểm của mình bằng cách sử dụng "tấm hình" phong cách, bàn phím, một lần hiển thị, không được ẩn cho đến khi vòi sử dụng phím tắt hoặc trình điều khiển chế độ xem phương thức là bị loại bỏ theo chương trình. Mục đích của hành vi này là để tránh hoạt ảnh quá mức khi người dùng di chuyển giữa các chế độ xem phần lớn, nhưng không hoàn toàn là trường văn bản.

Điều gì sẽ xảy ra khi áp dụng ở đây (biểu mẫu phương thức trên iPad). Rõ ràng là không thể loại bỏ bàn phím trong trường hợp này. Siêu. : \

+1

+1: tôi chỉ tìm thấy câu trả lời này sau khi kéo tóc ra trong một giờ để tìm ra điều này. và câu trả lời là quả táo đã làm điều này thực hiện ngu ngốc TRÊN MỤC ĐÍCH? bạn phải nói đùa với Apple. –

+9

Bạn có thể ghi đè phương thức 'disablesAutomaticKeyboardDismissal' và trả về NO cho bộ điều khiển xem đang được trình bày một cách bình thường. Điều này sẽ làm việc xung quanh hành vi mặc định của việc ngăn chặn bàn phím bị loại bỏ. – gdavis

+1

Thật không may, các khuyết tậtAutomaticKeyboardDismissal sửa chữa dường như đã ngừng làm việc với iOS 6. Bất cứ ai khác nhìn thấy giống nhau? – Snips

1

Kể từ khi ghi đè disablesAutomaticKeyboardDismissal không hoạt động trên iOS6, tôi phải kết nối "đã kết thúc vào Exit" sự kiện mỗi trường text đến một phương pháp và sau đó bỏ qua bàn phím ở đó, như vậy:

- (IBAction)doneEditing:(id)sender { 

[sender endEditing:YES]; 

}

0

Các disablesAutomaticKeyboardDismissal từ chối làm việc cho tôi trên iOS 7.

Nhưng ... Tôi cố gắng giải quyết vấn đề này bằng cách đơn giản vô hiệu hóa các UITextFields trên màn hình.

Giải pháp của tôi được mô tả here.

Điều này thậm chí hoạt động trên Modal UIViewController s.

0

Tôi vừa tìm thấy một tình huống duy nhất mà điều này xảy ra. Tôi có một cái nhìn rằng khi bác bỏ lá bàn phím lên trên màn hình. Tôi đã kiểm tra mọi thứ, các đại biểu UITextFields của tôi đã được kết nối với quan điểm của tôi, vv. Cố gắng loại bỏ bàn phím theo cách thủ công trong viewWillDisappear() sẽ không hoạt động, hoặc bằng resignFirstResponder() trên các trường hoặc endEditing() trên khung nhìn.

Sau đó, tôi nhận ra đó là mã xác thực trường của tôi trong chính các phương thức ủy nhiệm. Mỗi khi chỉnh sửa kết thúc trong một trường, tôi xác nhận văn bản trong textFieldShouldEndEditing phương thức ủy nhiệm để đảm bảo văn bản là hợp lý, giống như thế này, và không cho phép chúng bỏ tab ra khỏi trường cho đến khi nó được xác nhận hợp lệ.

func textFieldShouldEndEditing(textField: UITextField) -> Bool 
    { 
     if self.validateField(textField) { 
      return true 
     } else { 
      return false 
     } 
    } 

Vì vậy, khi người dùng quay trở lại giao diện trước đó mà không cần nhập bất kỳ văn bản, xác nhận thất bại, lĩnh vực văn bản không được phép từ bỏ đó là tình trạng trả lời đầu tiên, và bàn phím vẫn còn trên màn hình khi họ trở về trước lượt xem.

Đó là một tình huống bất thường nhưng hy vọng điều này sẽ giúp người khác chạy vào nó.

+1

hoặc chỉ 'return self.validateField (textField)' – Alnitak

0

Trong nhanh chóng chỉ cho UITextField của bạn một đại biểu và tạo textFieldShouldReturn(), xem dưới đây ví dụ -

class ViewController: UIViewController, UITextFieldDelegate { 
    func settingUpTextField() { 
     textField.delegate = self; 
     return; 
    } 
    ... 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder(); 
     return true; 
    } 
} 

đã hoàn tất!