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 AppDelegate
veya UIViewController
alt 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 view
etmek UIViewController
görünüm denetleyicisi ilk savunan ise, onu kimin yönettiğini.
Ancak, var
mevcut 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 next
kendisi 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