Güncelleme: Yanılmışım. Gerçekten UIApplication.shared.sendAction(_:to:from:for:)bu bağlantıda gösterilen ilk yanıtlayıcıyı aramak için kullanabilirsiniz : http://stackoverflow.com/a/14135456/746890 .
Buradaki yanıtların çoğu, görünüm hiyerarşisinde değilse geçerli ilk yanıtlayıcıyı gerçekten bulamaz. Örneğin AppDelegateveya UIViewControlleralt sınıflar.
İlk yanıtlayıcı nesnesi a olmasa bile, onu bulmanızı garanti etmenin bir yolu vardır UIView.
İlk olarak, şu nextözelliği kullanarak tersine çevrilmiş bir sürümünü uygulayalım UIResponder:
extension UIResponder {
var nextFirstResponder: UIResponder? {
return isFirstResponder ? self : next?.nextFirstResponder
}
}
Bu hesaplanan özellik sayesinde, geçerli olmasa bile, ilk yanıtlayıcıyı aşağıdan yukarıya doğru bulabiliriz UIView. Örneğin, bir gelen viewetmek UIViewControllergörünüm denetleyicisi ilk savunan ise, onu kimin yönettiğini.
Ancak, varmevcut ilk yanıtlayıcıyı elde etmek için yine de yukarıdan aşağıya bir çözünürlüğe ihtiyacımız var .
Önce görünüm hiyerarşisinde:
extension UIView {
var previousFirstResponder: UIResponder? {
return nextFirstResponder ?? subviews.compactMap { $0.previousFirstResponder }.first
}
}
Bu, ilk yanıtlayıcıyı geriye doğru arayacaktır ve bulamazsa, alt görünümlerine aynı şeyi yapmasını söyler (çünkü alt görünümünün nextkendisi olması gerekmez). Bununla, dahil olmak üzere herhangi bir görünümden bulabilirsiniz UIWindow.
Ve son olarak, bunu yapabiliriz:
extension UIResponder {
static var first: UIResponder? {
return UIApplication.shared.windows.compactMap({ $0.previousFirstResponder }).first
}
}
İlk yanıtlayıcıyı almak istediğinizde şunu arayabilirsiniz:
let firstResponder = UIResponder.first