如何解决iOS-从Objective-C调用的Swift中的NFCTagReaderSessionDelegate不调用tagReaderSession
我们使用j2objc从Java交叉编译源开发iOS应用。 因此,该应用的大部分内容都在Objective-C中。
我决定快速实施NFCTagReaderSessionDelegate,因此必须为新应用程序原生实现某些功能,例如NFCTag读取。
为了测试它,我实现了一个自定义的UIButton,按下该按钮将启动NFCTagReaderSession。 它可以与10种不同的NFC标签配合使用。 ISO,mifare等。
接下来,我将Objective-c和Swift设置为可以一起使用,这也可以正常工作。 Objective-c类在Swift中调用该函数将启动会话,并且NFCApp似乎正在读取标签。
但是就像从Swift-Button启动一样,NFCTagReaderSessionDelegate的接口函数永远不会被调用: func tagReaderSessionDidBecomeActive(_ session:NFCTagReaderSession) func tagReaderSession(_会话:NFCTagReaderSession,didDetect标签:[NFCTag])
我试图用@objc标记tagReaderSessionDidBecomeActive等,但这没什么区别。
工作代码:
import CoreNFC
import Foundation
import UIKit
class ScanNfcTestButton: BauhofButton,NFCTagReaderSessionDelegate {
var session: NFCTagReaderSession?
func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
print("readerSessionDidBecomeActive")
}
func tagReaderSession(_ session: NFCTagReaderSession,didInvalidateWithError error: Error) {
print(error.localizedDescription)
}
func tagReaderSession(_ session: NFCTagReaderSession,didDetect tags: [NFCTag]) {
print("didDetect: \(tags.description)")
...
}
override init(frame: CGRect) {
super.init(frame: frame)
addTarget(self,action: #selector(self.buttonClicked),for: .touchDown)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
addTarget(self,for: .touchDown)
}
@objc func buttonClicked(sender:UIButton!) {
// getting access to the window object from SceneDelegate
let rootController = UIApplication.shared.delegate?.window?!.rootViewController
guard NFCTagReaderSession.readingAvailable else {
let alertController = UIAlertController(
title: "NFC scannen nicht erlaubt!",message: "Mit diesem Gerät ist es nicht möglich NFC Tags zu scannen. Ggf. muss dies in den Systemeinstellungen aktiviert werden.",preferredStyle: .alert
)
alertController.addAction(UIAlertAction(title: "OK",style: .default,handler: nil))
rootController!.present(alertController,animated: true,completion: nil)
return
}
session = NFCTagReaderSession(pollingOption: [.iso14443,.iso15693,.iso18092],delegate: self,queue: nil)
session?.alertMessage = "Halte das iPhone nah an den NFC-Tag des Geräts,dass Du ausleihen willst."
session?.begin()
}
}
从Objective-c调用的Swift类:
import CoreNFC
import Foundation
import UIKit
// Subclass from NSObject to make it visible for objective-c
@objc class ScanNfcTag: NSObject,NFCTagReaderSessionDelegate {
var session: NFCTagReaderSession?
var nfcScanlistener: DePidataConnectNfcNfcScanListener?
func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
print("readerSessionDidBecomeActive")
}
func tagReaderSession(_ session: NFCTagReaderSession,didDetect tags: [NFCTag]) {
print("didDetect: \(tags.description)") ...
}
@objc public func readNfcTag(nfcScanlistener: DePidataConnectNfcNfcScanListener) {
self.nfcScanlistener = nfcScanlistener
startNfcSession()
}
private func startNfcSession() {
// getting access to the window object from SceneDelegate
let rootController = UIApplication.shared.delegate?.window?!.rootViewController
guard NFCTagReaderSession.readingAvailable else {
let alertController = UIAlertController(
title: "NFC scannen nicht erlaubt!",dass Du ausleihen willst."
session?.begin()
}
}
摘要:
编辑: 如果我们在session.?begin()的调试器(AppCode或XCode)中设置断点,然后等待它起作用的对象。从Objective-C调用时,类的初始化似乎存在问题。 我们尝试延迟会议的开始时间,但无济于事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。