使用completionSelector和completionTarget与UIImageWriteToSavedPhotosAlbum

我试图找出一个办法让我的iOS应用程序保存到相机胶卷的屏幕截图,然后popup警告告诉用户屏幕截图已成功保存。

我认为这样做的唯一方法就是使用某种forms的if / else循环(正如您在下面的伪代码注释中看到的那样),但是我想不出任何语法可以使用UIKit的UIImageWriteToSavedPhotosAlbum函数。 我遇到了一些build议,说在Apple的开发网站上使用completionSelector和completionTarget,但我真的不明白如何使用它们,或者我的代码中completionSelectorcompletionTarget应该使用什么特定的字典。 我对Swift比较陌生。

有人可以解释他们如何工作,以及如何find在我的代码中使用它们的语法?

 func screenshotMethod() { UIGraphicsBeginImageContextWithOptions(HighchartsView.scrollView.contentSize, false, 0); view.layer.renderInContext(UIGraphicsGetCurrentContext()) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) //if saved to Camera Roll // { // confirmScreenshot() // } // //else // { // exit code/stop // } } func confirmScreenshot() { let alertController = UIAlertController(title: "Success", message: "This chart has been successfully saved to your Camera Roll.", preferredStyle: .Alert) let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil) alertController.addAction(defaultAction) presentViewController(alertController, animated: true, completion: nil) } 

 import UIKit class ViewController: UIViewController { @IBAction func buttonPressed(sender: AnyObject) { presentImagePickerController() } } extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { func presentImagePickerController() { let imagePickerController = UIImagePickerController() imagePickerController.delegate = self imagePickerController.sourceType = .PhotoLibrary imagePickerController.allowsEditing = false presentViewController(imagePickerController, animated: true, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { UIImageWriteToSavedPhotosAlbum(image, self, "image:didFinishSavingWithError:contextInfo:", nil) } func imagePickerControllerDidCancel(picker: UIImagePickerController) { self.dismissViewControllerAnimated(true, completion: nil) } func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafePointer<Void>) { guard error == nil else { //Error saving image return } //Image saved successfully } } 

下面是一个工作示例,用于在SWIFT 3.0中的相机卷中保存当前视图的屏幕截图

  @IBAction func saveScreenshot(_ sender: Any) { //Create the UIImage UIGraphicsBeginImageContextWithOptions(editorView.frame.size, false, UIScreen.main.scale) // UIGraphicsBeginImageContext(myTextView.frame.size) editorView.layer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() UIImageWriteToSavedPhotosAlbum(image!, self, #selector(TextEditorViewController.image(_:didFinishSavingWithError:contextInfo:)), nil) } func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) { if let error = error { // we got back an error! let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) present(ac, animated: true) } else { let ac = UIAlertController(title: "Saved!", message: "Your image has been saved to your photos.", preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) present(ac, animated: true) } 

}

@敢于检查错误的解决scheme不适合我(Swift 2.0)。

这个微小的修改确实奏效:

 func image(image: UIImage, didFinishSavingWithError: NSError?, contextInfo:UnsafePointer<Void>) { if didFinishSavingWithError != nil { Helper.showNotifierInfo(DefaultTextFailed) } else { Helper.showNotifierInfo(DefaultTextSaved) } } 

另一个例子在迅速2.2

这个例子中的关键区别是具有callback函数的类必须从NSObject扩展 (@objc也可以)

 func writeImage(){ let responder = WriteImageToFileResponder() responder.addCompletion{ print("completed") } let image = UIImage(color: .redColor(), size: CGSize(width: 100, height: 100))! UIImageWriteToSavedPhotosAlbum(image, responder, #selector(WriteImageToFileResponder.image(_:didFinishSavingWithError:contextInfo:)), nil) } class WriteImageToFileResponder: NSObject { var completion: (() -> Void)? func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeMutablePointer<Void>) { print(error) completion?() } func addCompletion(completion: (() -> Void)? ) { self.completion = completion } }