[英]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.