簡體   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