업데이트 : 내가 틀렸다. 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