变量显示为 nil - swift 4 IOS

Posted

技术标签:

【中文标题】变量显示为 nil - swift 4 IOS【英文标题】:Variables show up as nil - swift 4 IOS 【发布时间】:2019-05-07 23:04:18 【问题描述】:

由于某种原因,我的变量 stringy 和 stringy 可以很好地打印到控制台,但是当我尝试将它们设置为标签时,它们显示为 nil。

我的目标是将字符串和浮点数打印到应用程序视图控制器,但这不起作用。

我认为它与viewdidload有关,好像它隐藏了全局变量。但是,如果我尝试将标签设置在 viewdidload 之外,则会收到声明错误。

//  ViewController.swift
//  Intellicam
//

import UIKit
import AVKit
import Vision

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate 

    var stringy:String!
    var stringie:Float!

    override func viewDidLoad() 
        super.viewDidLoad()



        //here we start the camera

        let captureSession = AVCaptureSession()
        captureSession.sessionPreset = .photo
        guard let captureDevice = AVCaptureDevice.default(for: .video) else  return 
        guard let input = try? AVCaptureDeviceInput(device: captureDevice) else return
        captureSession.addInput(input)
        captureSession.startRunning()

        let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        view.layer.addSublayer(previewLayer)
        previewLayer.frame = view.frame

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
        captureSession.addOutput(dataOutput)

     //   let request = VNCoreMLModel(model: VNCoreMLModel, completionHandler: VNRequestCompletionHandler)
     //   VNImageRequestHandler(cgImage: <#T##CGImage#>, options: <#T##[VNImageOption : Any]#>)

        self.Labele.text = "Guess: \(stringy) + Certainty: \(stringie)"

    

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) 
        //print("Camera was able to capture a frame:", Date())

        guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else return

        guard let model = try? VNCoreMLModel(for: Resnet50().model) else return
        let request = VNCoreMLRequest(model: model)
            (finishedReq, err) in
            //print(finishedReq.results)

            guard let results = finishedReq.results as? [VNClassificationObservation] else return

             guard let firstObservastion = results.first else return


            //print("Guess: \(firstObservastion.identifier) Certainty: \(firstObservastion.confidence)%")

            self.stringy = firstObservastion.identifier
            self.stringie = firstObservastion.confidence

            print(self.stringy)
            print(self.stringie)

        

        try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
    

    @IBOutlet weak var Labele: UILabel!



【问题讨论】:

您的请求是异步。您需要移动逻辑以在请求的完成中设置标签,或者为 captureOutput 方法完成并在那里处理它。这应该会有所帮助 - ***.com/questions/52287840/… 在确定 stringy 和 stringie 不为零后,只需设置标签的值。您可以直接在 captureOutput 函数中执行此操作,但需要在主线程中完成,因为它是 UI 更新。 DispatchQueue.main.async self.Labele.text =“猜测:(字符串)+确定性:(字符串)” 【参考方案1】:

在确定价值之前,永远不要强行展开。在您的情况下, VNCoreModelRequest 可能会失败,并且您的两个变量都将被取消分配,因此它将使您的应用程序崩溃。 还有一件事要确保您对标签使用正确的命名约定。

你的问题是你没有从你得到的结果中设置标签值。

解决这个问题

 var stringy:String? 
    didSet 
        DispatchQueue.main.async 
            self.Labele.text = self.stringy
        
    

        self.stringy = firstObservastion.identifier
        self.stringie = firstObservastion.confidence
        DispatchQueue.main.async 
             self.Labele.text = "Guess: \(stringy) + Certainty: \(stringie)"
         

【讨论】:

以上是关于变量显示为 nil - swift 4 IOS的主要内容,如果未能解决你的问题,请参考以下文章

IOS学习之路——Swift语言——基本类型与函数

Swift - 在展开可选值时意外发现 nil - 从委托调用变量

Swift 5 API 调用数据变量 nil 但 API 证明有效

如果变量不是 nil,如何在 swift UI 中显示文本视图?

实例化的可选变量在 Xcode 调试器中显示为 nil

Swift - 检查弱变量是不是为 nil 或不是线程安全的?