Update: Ich habe mich geirrt. Sie können in der Tat UIApplication.shared.sendAction(_:to:from:for:)
den in diesem Link gezeigten Ersthelfer anrufen: http://stackoverflow.com/a/14135456/746890 .
Die meisten Antworten hier können den aktuellen Ersthelfer nicht wirklich finden, wenn er nicht in der Ansichtshierarchie enthalten ist. Zum Beispiel AppDelegate
oder UIViewController
Unterklassen.
Es gibt eine Möglichkeit, sicherzustellen, dass Sie es finden, auch wenn das Ersthelferobjekt kein a ist UIView
.
Lassen Sie uns zunächst eine umgekehrte Version davon implementieren, indem Sie die next
Eigenschaft von UIResponder
:
extension UIResponder {
var nextFirstResponder: UIResponder? {
return isFirstResponder ? self : next?.nextFirstResponder
}
}
Mit dieser berechneten Eigenschaft können wir den aktuellen Ersthelfer von unten nach oben finden, auch wenn dies nicht der Fall ist UIView
. Zum Beispiel von a view
nachUIViewController
wer es verwaltet, wenn der View Controller der Ersthelfer ist.
Wir benötigen jedoch immer noch eine Top-Down-Auflösung, eine einzige var
, um den aktuellen Ersthelfer zu erhalten.
Zunächst mit der Ansichtshierarchie:
extension UIView {
var previousFirstResponder: UIResponder? {
return nextFirstResponder ?? subviews.compactMap { $0.previousFirstResponder }.first
}
}
Dadurch wird der Ersthelfer rückwärts gesucht, und wenn er nicht gefunden werden kann, werden seine Unteransichten angewiesen, dasselbe zu tun (da die Unteransichten next
nicht unbedingt selbst sind). Damit können wir es aus jeder Sicht finden, auch UIWindow
.
Und schließlich können wir dies bauen:
extension UIResponder {
static var first: UIResponder? {
return UIApplication.shared.windows.compactMap({ $0.previousFirstResponder }).first
}
}
Wenn Sie also den Ersthelfer abrufen möchten, können Sie anrufen:
let firstResponder = UIResponder.first