อัปเดต: ฉันผิด แน่นอนคุณสามารถใช้UIApplication.shared.sendAction(_:to:from:for:)
เพื่อเรียกครั้งแรกตอบกลับแสดงให้เห็นในลิงค์นี้: http://stackoverflow.com/a/14135456/746890
คำตอบส่วนใหญ่ที่นี่ไม่สามารถหาคำตอบแรกได้ในปัจจุบันหากไม่ได้อยู่ในลำดับชั้นการดู ตัวอย่างเช่นAppDelegate
หรือUIViewController
คลาสย่อย
UIView
ไม่มีทางที่จะรับประกันว่าคุณจะหามันแม้ว่าวัตถุครั้งแรกตอบกลับไม่ได้เป็นเป็น
ก่อนอื่นให้ใช้เวอร์ชันที่กลับรายการโดยใช้next
คุณสมบัติของUIResponder
:
extension UIResponder {
var nextFirstResponder: UIResponder? {
return isFirstResponder ? self : next?.nextFirstResponder
}
}
UIView
ด้วยคุณสมบัติการคำนวณนี้เราสามารถหาสิ่งที่ตอบกลับแรกปัจจุบันจากด้านล่างขึ้นไปด้านบนถึงแม้ว่ามันจะไม่ได้ ตัวอย่างเช่นจาก a view
ถึงUIViewController
ผู้ที่จัดการกับมันหากตัวควบคุมมุมมองเป็นการตอบกลับครั้งแรก
อย่างไรก็ตามเรายังต้องการความละเอียดจากบนลงล่างหนึ่งครั้งvar
เพื่อรับการตอบกลับปัจจุบัน
ก่อนอื่นด้วยลำดับชั้นการดู:
extension UIView {
var previousFirstResponder: UIResponder? {
return nextFirstResponder ?? subviews.compactMap { $0.previousFirstResponder }.first
}
}
สิ่งนี้จะค้นหาการตอบกลับครั้งแรกและหากไม่สามารถหาได้มันจะบอกให้ผู้ชมย่อยทำสิ่งเดียวกัน (เพราะมุมมองย่อยnext
นั้นไม่จำเป็นต้องทำเอง) ด้วยวิธีนี้เราสามารถหาได้จากมุมมองใด ๆ UIWindow
รวมทั้ง
และในที่สุดเราสามารถสร้างสิ่งนี้:
extension UIResponder {
static var first: UIResponder? {
return UIApplication.shared.windows.compactMap({ $0.previousFirstResponder }).first
}
}
ดังนั้นเมื่อคุณต้องการดึงการตอบกลับแรกคุณสามารถโทร:
let firstResponder = UIResponder.first