अपडेट: मैं गलत था। आप वास्तव UIApplication.shared.sendAction(_:to:from:for:)
में इस लिंक में प्रदर्शित पहले प्रत्युत्तर को कॉल करने के लिए उपयोग कर सकते हैं : http://stackoverflow.com/a/14135456/7464690 ।
यदि उत्तर पदानुक्रम में नहीं है, तो यहां अधिकांश उत्तर वास्तव में वर्तमान पहला उत्तर नहीं मिल सकता है। उदाहरण के लिए, AppDelegate
या UIViewController
उपवर्ग।
आपको यह पता लगाने की गारंटी देने का एक तरीका है कि यहां तक कि अगर पहला उत्तरदाता ऑब्जेक्ट नहीं है UIView
।
पहले इसकी next
संपत्ति के उपयोग से इसका उलटा संस्करण लागू करने की सुविधा देता है UIResponder
:
extension UIResponder {
var nextFirstResponder: UIResponder? {
return isFirstResponder ? self : next?.nextFirstResponder
}
}
इस गणना की गई संपत्ति के साथ, हम नीचे से ऊपर तक वर्तमान पहला उत्तरदाता पा सकते हैं, भले ही वह ऐसा न हो UIView
। उदाहरण के लिए, एक 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