简体   繁体   English

如何在 iOS Swift 中将图像从框架发送到示例项目?

[英]How to send image from framework to sample project in iOS Swift?

I have implemented document scanner using visionKit.我已经使用visionKit 实现了文档扫描仪。 Initially i have faced camera dismiss issue and it fixed.最初我遇到了相机关闭问题并且它已修复。 Now i am trying to send image after camera dismiss from framework to sample project.现在我试图在相机从框架中关闭后将图像发送到示例项目。

I have tried using completion handler, but it does not work.我曾尝试使用完成处理程序,但它不起作用。

Here is the code for framework:这是框架的代码:

public class A8Scan: NSObject, VNDocumentCameraViewControllerDelegate {

var imageNew: UIImage?
var statusImage: UIImageView?
private var clientView: UIViewController?
public init(_ viewController:UIViewController){

          self.clientView = viewController

   }

public func showScanner(imgData: UIImage?){

    self.createTaskController(img: imgData)

       print("Called Build")


 }

private func createTaskController(img: UIImage?){

     let scannerViewController = VNDocumentCameraViewController()
     scannerViewController.delegate = self
    self.clientView?.present(scannerViewController,animated:true,completion:  {

            self.imageNew = img

    })


 }

public func imageFromFile(result: @escaping (_ image: UIImage?) -> Void){

         //the image
    let scannerViewController = VNDocumentCameraViewController()
    scannerViewController.delegate = self
    self.clientView?.present(scannerViewController,animated:true,completion: nil)

     if imageNew != nil {

         result(imageNew)
         }
         else{
             //callback nil so the app does not pause infinitely if
             //the error != nil
         result(nil)
         }

 }

func set(image: UIImage) {

    self.statusImage?.image = image

}

public func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
        guard scan.pageCount >= 1 else {
            controller.dismiss(animated: true)
            return
        }

        let originalImage = scan.imageOfPage(at: 0)
        let newImage = compressedImage(originalImage)
        imageNew = newImage
        set(image: imageNew!)
        print("new image::\(newImage.size)")
        controller.dismiss(animated: true, completion: nil)

//        processImage(newImage)
    }

    public func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) {
        print(error)
        controller.dismiss(animated: true)
    }

    public func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
        controller.dismiss(animated: true)
    }

    func compressedImage(_ originalImage: UIImage) -> UIImage {
        guard let imageData = originalImage.jpegData(compressionQuality: 1),

            let reloadedImage = UIImage(data: imageData) else {

                return originalImage
        }
        return reloadedImage
    }

 }

Here is the code sample project:这是代码示例项目:

     @IBAction func btnAction(_ sender: Any) {

 //        A8Scan(self).showScanner()
 //        A8Scan(self).showScanner(imgData: im)
 //        print("nn", A8Scan(self).showScanner(imgData: im))

    A8Scan(self).imageFromFile { (image) in

        if image != nil {

            print(image!)
        } else {

            print("something went wrong")
        }
    }
//        p()
}

func p (){
    ScannerViewController().imageFromFile{(image: UIImage?) -> Void in
        //use the image that was just retrieved

        print("image data", image)
    }
}

My issue is after camera dismiss from framework it does not send image from framework to sample project.我的问题是从框架中关闭相机后,它不会将图像从框架发送到示例项目。

Any help much appreciated pls....任何帮助非常感谢请....

1- Add this inside your framework 1- 在您的框架中添加它

var callBack((UIImage)-())?

 public func show() { 
   let scannerViewController = VNDocumentCameraViewController()
   scannerViewController.delegate = self 
   self.clientView?.present(scannerViewController,animated:true,completion: nil)
}

2- 2-

let newImage = compressedImage(originalImage)
callBack?(newImage)

3- 3-

Then inside the vc that uses it然后在使用它的vc里面

let vc = A8Scan(self)
vc.show()
vc.callBack = { [weak self] image in

}

As you are using a middle man (A8Scan) NSObject to present a controller.当您使用中间人 (A8Scan) NSObject 来呈现控制器时。 the A8Scan will get deallocated immediately after presenting the controller which you can confirm by keeping a deinit function inside A8Scan. A8Scan 将在呈现控制器后立即解除分配,您可以通过在 A8Scan 中保留 deinit 功能来确认。

A workaround for this is to make your NSObject (A8Scan) as a singleton ie add一种解决方法是将您的 NSObject (A8Scan) 作为单例,即添加

static let shared = A8Scan()
var callBack: ((_ image: UIImage?) -> Void)?

remove the existing init method and add the viewcontroller property into the imageFromFile: method, your function will look like this删除现有的 init 方法并将 viewcontroller 属性添加到imageFromFile:方法中,您的函数将如下所示

public func imageFromFile(sender: UIViewController, result: @escaping (_ image: UIImage?) -> Void){
   let scannerViewController = VNDocumentCameraViewController()
   scannerViewController.delegate = self
   self.callBack = result
   sender.present(scannerViewController,animated:true,completion: nil)
}

public func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
    guard scan.pageCount >= 1 else {
        controller.dismiss(animated: true)
        return
    }

    let originalImage = scan.imageOfPage(at: 0)
    let newImage = compressedImage(originalImage)
    imageNew = newImage
    set(image: imageNew!)
    callBack?(imageNew!)
    controller.dismiss(animated: true, completion: nil)
}

and finally in your sample project,最后在您的示例项目中,

 @IBAction func btnAction(_ sender: Any) {
  A8Scan.shared.imageFromFile(sender: self) { (image) in
     if image != nil {
         print(image!)
     } else {
         print("something went wrong")
     }
   }
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 iOS Swift:从 iOS 框架向 iOS 应用程序发送日志信息 - iOS Swift: Send log information to iOS app from iOS framework 如何从 Swift 框架回调到 Flutter 项目? - How to Callback from Swift Framework to Flutter project? 如何从 iOS 框架加载/读取字体,这些字体已经添加到 Swift 的主项目中? - How to load/Read Fonts from iOS framework, which are already added in main project in Swift? 使用ooVoo框架“存档”示例swift项目时出现链接器错误 - linker error when 'archive' a sample swift project with ooVoo framework 如何在IOS设备中运行示例项目? - How to run sample project in IOS device? 如何从 iOS Swift 的框架中关闭相机控制器? - How to dismiss camera controller from framework in iOS Swift? 框架文件在iOS Swift框架项目中始终为红色 - Framework file is always red in iOS Swift Framework Project 如何将信息从一个视图控制器发送到另一个? (斯威夫特 - IOS) - How to send info from one viewcontroller to another? (Swift - IOS) 如何通过UI Label(Swift 2 IOS 9)在应用程序中发送电子邮件? - How to send email in app from UI Label (Swift 2 IOS 9)? 如何从我的iOS应用程序发送邮件 - SWIFT - how to send a mail from my iOS application- SWIFT
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM