2017-04-10 62 views
0

我試圖將SQLClient實現到現有的iOS應用程序中。該應用程序是一個條形碼閱讀器,通過局域網將數據插入數據庫。 SQLClient的委託屬性必須設置爲NSObject以進行錯誤處理,但我在設置時遇到問題。 我的實施麻煩在最後的方法found如何正確設置委託屬性? (swift)

首先,Xcode希望我下調到更具體的類型。在採取Xcode的建議並鑄造client as Anyobject後,我得到Ambiguous use of delegate

所以,簡而言之,我需要幫助設置SQLClient的委託屬性,以便我可以觸發我的插入。我願意瞭解你們是否可以推薦資源或提供指導。

SQLCLIENT - >https://github.com/martinrybak/SQLClient

// 
// QRScannerController.swift 
// QRCodeReader 
// 
// Created by Simon Ng on 13/10/2016. 
// Copyright © 2016 AppCoda. All rights reserved. 
// 

import UIKit 
import AVFoundation 


class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 

    @IBOutlet var messageLabel:UILabel! 
    @IBOutlet var topbar: UIView! 

    var captureSession:AVCaptureSession? 
    var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
    var qrCodeFrameView:UIView? 

    let supportedCodeTypes = [AVMetadataObjectTypeUPCECode, 
         AVMetadataObjectTypeCode39Code, 
         AVMetadataObjectTypeCode39Mod43Code, 
         AVMetadataObjectTypeCode93Code, 
         AVMetadataObjectTypeCode128Code, 
         AVMetadataObjectTypeEAN8Code, 
         AVMetadataObjectTypeEAN13Code, 
         AVMetadataObjectTypeAztecCode, 
         AVMetadataObjectTypePDF417Code, 
         AVMetadataObjectTypeQRCode] 

    override func viewDidLoad() { 
     super.viewDidLoad() 



     // Get an instance of the AVCaptureDevice class to initialize a device object and provide the video as the media type parameter. 
     let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

     do { 
      // Get an instance of the AVCaptureDeviceInput class using the previous device object. 
      let input = try AVCaptureDeviceInput(device: captureDevice) 

      // Initialize the captureSession object. 
      captureSession = AVCaptureSession() 

      // Set the input device on the capture session. 
      captureSession?.addInput(input) 

      // Initialize a AVCaptureMetadataOutput object and set it as the output device to the capture session. 
      let captureMetadataOutput = AVCaptureMetadataOutput() 
      captureSession?.addOutput(captureMetadataOutput) 

      // Set delegate and use the default dispatch queue to execute the call back 
      captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
      captureMetadataOutput.metadataObjectTypes = supportedCodeTypes 

      // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer. 
      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
      videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
      videoPreviewLayer?.frame = view.layer.bounds 
      view.layer.addSublayer(videoPreviewLayer!) 

      // Start video capture. 
      captureSession?.startRunning() 

      // Move the message label and top bar to the front 
      view.bringSubview(toFront: messageLabel) 
      view.bringSubview(toFront: topbar) 

      // Initialize QR Code Frame to highlight the QR code 
      qrCodeFrameView = UIView() 

      if let qrCodeFrameView = qrCodeFrameView { 
       qrCodeFrameView.layer.borderColor = UIColor.green.cgColor 
       qrCodeFrameView.layer.borderWidth = 2 
       view.addSubview(qrCodeFrameView) 
       view.bringSubview(toFront: qrCodeFrameView) 
      } 

     } catch { 
      // If any error occurs, simply print it out and don't continue any more. 
      print(error) 
      return 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    // MARK: - AVCaptureMetadataOutputObjectsDelegate Methods 

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 
     captureSession?.stopRunning() 
     // Check if the metadataObjects array is not nil and it contains at least one object. 
     if metadataObjects == nil || metadataObjects.count == 0 { 
      qrCodeFrameView?.frame = CGRect.zero 
      messageLabel.text = "No QR/barcode is detected" 
      return 
     } 

     // Get the metadata object. 
     let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 

     if supportedCodeTypes.contains(metadataObj.type) { 
      // If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds 
      let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) 
      qrCodeFrameView?.frame = barCodeObject!.bounds 

      if metadataObj.stringValue != nil { 
       messageLabel.text = metadataObj.stringValue 
       print(metadataObj.stringValue) 
       found(code: metadataObj.stringValue) 

      } 
     } 
    } 

    func found(code: String) { 
     print(code) 
     /* 
     Fire off the QR code to the database 
     */ 
     let client = SQLClient.sharedInstance()! 
     client.delegate = client.self 

    } 
} 
+0

如果你看一下鏈接你的樣品提供的代碼是'client.delegate = self'。這應該可行,假設您的類更新爲實現SQLClientDelegate協議。 –

+0

我試過'client.delegate = self',但沒有運氣。我不認爲我的類已經更新以實現'SQLClientDelegate'。我會在QRScannerController中做這件事,做一個新班級,還是擴展SQLClient? – Openmic

+0

如果你要在'QRScannerController'裏面使用'self',那麼你就必須這樣做。這就是'self'的意思:「這個對象」。 –

回答

0

這最終被我錯過的部分。

擴展QRScannerController:SQLClientDelegate { FUNC錯誤(_錯誤:字符串!代碼:的Int32,嚴重性:Int32)已{ 打印(錯誤) }}