NSObject 委托方法未被调用
NSObject Delegate Methods are not being called
我正在构建一个 NFC 阅读应用程序。我希望我所有的 NFC 实现都在一个名为 NFCReader 的单独 class 中,这样每次用户点击我的 MainVC 中的 readNFC 按钮时我都可以调用它。这是我当前的 MainVC 代码:
class MainVC: ViewController {
@IBOutlet weak var readNFCButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
addTargetToReadNFCButton()
}
private func addTargetToReadNFCButton() {
readNFCButton.addTarget(self, action: #selector(readNFCButtonTouched), for: .touchUpInside)
}
@objc func readNFCButtonTouched() {
NFCReader().beginNFCReaderSession()
}
}
这是我的 NFCReader class 代码:
class NFCReader: NSObject {
var session: NFCReaderSession?
func beginNFCReaderSession() {
session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session!.alertMessage = "Hold your device near your tag for scanning"
session!.begin()
}
}
extension NFCReader: NFCNDEFReaderSessionDelegate {
func readerSessionDidBecomeActive(_ session: NFCNDEFReaderSession) {
print("readerSessionDidBecomeActive")
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
print("didDetectTags")
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print(error.localizedDescription)
}
}
问题是从未调用 NFCReader 的委托函数。如果我将来自 NFCReader class 的代码放入我的 MainVC class 并直接调用它,每次扫描 NFC 标签时都会调用委托函数。此代码有效:
class MainVC: ViewController {
@IBOutlet weak var readNFCButton: UIButton!
var session: NFCReaderSession?
override func viewDidLoad() {
super.viewDidLoad()
addTargetToReadNFCButton()
}
private func addTargetToReadNFCButton() {
readNFCButton.addTarget(self, action: #selector(readNFCButtonTouched), for: .touchUpInside)
}
@objc func readNFCButtonTouched() {
beginNFCReaderSession()
}
func beginNFCReaderSession() {
session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session!.alertMessage = "Hold your device near your tag for scanning"
session!.begin()
}
}
extension MainVC: NFCNDEFReaderSessionDelegate {
func readerSessionDidBecomeActive(_ session: NFCNDEFReaderSession) {
print("readerSessionDidBecomeActive")
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
print("didDetectTags")
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print(error.localizedDescription)
}
}
有什么方法可以让委托函数在我的 NFCReader class 中工作,而不是在 MainVC 中工作?我的单独实现有什么错误?
感谢任何帮助!
已编辑:
我通过将 NFCReader 属性 添加到主 MainVC class:
来解决它
let nfcReader = NFCReader()
并这样称呼它:
@objc func readNFCButtonTouched() {
nfcReader.beginNFCReaderSession()
}
感谢您的帮助!
您的 NFCReader
正在初始化,然后几乎立即取消初始化,因为您没有存储任何对它的引用(这是保持对象存活所必需的)。
您可以通过在 NFCReader
class
的 deinit
中放置一个断点来确认这一点
我正在构建一个 NFC 阅读应用程序。我希望我所有的 NFC 实现都在一个名为 NFCReader 的单独 class 中,这样每次用户点击我的 MainVC 中的 readNFC 按钮时我都可以调用它。这是我当前的 MainVC 代码:
class MainVC: ViewController {
@IBOutlet weak var readNFCButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
addTargetToReadNFCButton()
}
private func addTargetToReadNFCButton() {
readNFCButton.addTarget(self, action: #selector(readNFCButtonTouched), for: .touchUpInside)
}
@objc func readNFCButtonTouched() {
NFCReader().beginNFCReaderSession()
}
}
这是我的 NFCReader class 代码:
class NFCReader: NSObject {
var session: NFCReaderSession?
func beginNFCReaderSession() {
session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session!.alertMessage = "Hold your device near your tag for scanning"
session!.begin()
}
}
extension NFCReader: NFCNDEFReaderSessionDelegate {
func readerSessionDidBecomeActive(_ session: NFCNDEFReaderSession) {
print("readerSessionDidBecomeActive")
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
print("didDetectTags")
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print(error.localizedDescription)
}
}
问题是从未调用 NFCReader 的委托函数。如果我将来自 NFCReader class 的代码放入我的 MainVC class 并直接调用它,每次扫描 NFC 标签时都会调用委托函数。此代码有效:
class MainVC: ViewController {
@IBOutlet weak var readNFCButton: UIButton!
var session: NFCReaderSession?
override func viewDidLoad() {
super.viewDidLoad()
addTargetToReadNFCButton()
}
private func addTargetToReadNFCButton() {
readNFCButton.addTarget(self, action: #selector(readNFCButtonTouched), for: .touchUpInside)
}
@objc func readNFCButtonTouched() {
beginNFCReaderSession()
}
func beginNFCReaderSession() {
session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session!.alertMessage = "Hold your device near your tag for scanning"
session!.begin()
}
}
extension MainVC: NFCNDEFReaderSessionDelegate {
func readerSessionDidBecomeActive(_ session: NFCNDEFReaderSession) {
print("readerSessionDidBecomeActive")
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
print("didDetectTags")
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print(error.localizedDescription)
}
}
有什么方法可以让委托函数在我的 NFCReader class 中工作,而不是在 MainVC 中工作?我的单独实现有什么错误?
感谢任何帮助!
已编辑:
我通过将 NFCReader 属性 添加到主 MainVC class:
来解决它 let nfcReader = NFCReader()
并这样称呼它:
@objc func readNFCButtonTouched() {
nfcReader.beginNFCReaderSession()
}
感谢您的帮助!
您的 NFCReader
正在初始化,然后几乎立即取消初始化,因为您没有存储任何对它的引用(这是保持对象存活所必需的)。
您可以通过在 NFCReader
class
deinit
中放置一个断点来确认这一点