Không có cách nào đơn giản để tìm firstResponder
trong iOS. Các câu trả lời ở trên chỉ theo dõi UIView
s nhưng tất cả các lớp con của UIResponder
chẳng hạn như UIViewController
có thể là một phản hồi đầu tiên.
Theo Quick Help
của UIResponder
:
Nhiều đối tượng chủ chốt cũng có phản ứng, trong đó có đối tượng UIApplication , các đối tượng UIViewController, và tất cả các đối tượng UIView (mà bao gồm UIWindow). Khi các sự kiện xảy ra, UIKit sẽ gửi chúng đến các đối tượng trả lời của ứng dụng để xử lý.
Và cách duy nhất để theo dõi UIResponder
chuỗi sẽ được sử dụng UIResponder
's next: UIResponder
thuộc tính.
Trả về bộ trả lời tiếp theo trong chuỗi phản hồi hoặc không có nếu không có không có phản hồi tiếp theo. Lớp UIResponder không tự động lưu trữ hoặc đặt tự động trả lời tiếp theo , do đó phương thức này trả về nil theo mặc định. Các lớp con phải ghi đè phương thức này và trả về một đáp ứng thích hợp tiếp theo. Ví dụ: UIView triển khai phương thức này và trả về đối tượng UIViewController quản lý nó (nếu có) hoặc trình giám sát (nếu không). UIViewController tương tự triển khai phương thức và trả về giám sát của chế độ xem của nó. UIWindow trả về đối tượng ứng dụng . UIApplication trả về nil.
Trong các đối tượng UIKit
nhất superview
, UIViewController
, UIWindow
, UIApplication
hoặc Appdelegate
sẽ là next
UIResponder
.
extension UIResponder {
func findFirstResponder() -> UIResponder? {
var responder: UIResponder? = self
while responder != nil {
guard let r = responder, r.isFirstResponder() else {
responder = responder?.next
continue
}
return r
}
return nil
}
}
Tuy nhiên phần trên không theo dõi anh chị em của responder
. Tôi đoán nếu bạn thực sự muốn theo dõi tất cả, bạn cần phải kiểm tra loại trả lời và theo dõi con của nó (subview, con xem điều khiển).
Bạn có bao nhiêu textFields trong tableView? –
Chúng được tạo tự động nhưng tôi đã tìm thấy một cách ngay bây giờ – Armand
Vui mừng khi biết điều đó, chỉ cần đăng nó làm câu trả lời. :) –