[英]Missing First Responder in iOS 11 with Swift 4 App (Xcode 9.X)?
我有一个精简的,基于代码的测试应用程序(没有Storyboard
),它具有:
UIWindow
对象 UIView
对象位于顶部。 - 为了测试哪个对象是第一个响应者,我按以下方式在tochesBegan
内的tochesBegan
进行评估,但是所有项目的响应均为false
。 响应程序链之所以起作用,是因为在topView和主控制器的视图中都检测到了触摸。
这是该应用程序的精简版本。 由于这不是一个简单的视图-子视图层次结构,因此我不使用递归函数。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow()
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
return true
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
let topView = View()
self.view.addSubview(topView)
}
}
class View: UIView {
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
self.backgroundColor = UIColor.yellow
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let window = (UIApplication.shared).delegate?.window as? UIWindow
let viewController = window?.rootViewController
let mainView = viewController?.view
print("Window?: \(window!.isFirstResponder)")
print("View Controller?: \(viewController!.isFirstResponder)")
print("Main View?: \(mainView!.isFirstResponder)")
for view in (mainView?.subviews)! {
print("Any View?: \(view.isFirstResponder)")
}
}
}
所有评估均返回false。 我在这里做错什么了吗?
问候... e
我相信如果没有子类,很少有视图对象(UITextField,UITextView)可以成为第一响应者,最好检查一下UIView
canBecomeFirstResponder
。
如果要实现此功能(例如突出显示,选择UIView),则必须对UIView进行子类化并重写becomeFirstResponder
,如下所示:
class CustomView: UIView {
override var isFirstResponder: Bool {
return true
}
}
要进行上述测试,请在ViewController中添加以下内容:
override func loadView() {
self.view = CustomView()
}
现在检查一下我们的CustomView是否为FirstResponder:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("View: \(self.view.isFirstResponder)")
}
我认为从一开始就没有第一响应者。 您仍然可以接收事件到您的视图。
响应者对象
鼠标事件和多点触摸事件首先进入鼠标指针或手指下方的视图; 该视图可能是也可能不是第一响应者。
nextResponder
UIResponder类不会自动存储或设置下一个响应者,因此默认情况下此方法返回nil。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.