繁体   English   中英

使用Swift 4 App(Xcode 9.X)在iOS 11中缺少第一响应者吗?

[英]Missing First Responder in iOS 11 with Swift 4 App (Xcode 9.X)?

我有一个精简的,基于代码的测试应用程序(没有Storyboard ),它具有:

  • UIWindow对象
  • ViewController及其主视图
  • 单个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。

更多关于nextResponder

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM