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 中放置一个断点来确认这一点