Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将completionSelector和completionTarget与UIImageWriteToSavedPhotosAlbum一起使用_Ios_Swift_Uiimage_Screenshot_Alert - Fatal编程技术网

Ios 将completionSelector和completionTarget与UIImageWriteToSavedPhotosAlbum一起使用

Ios 将completionSelector和completionTarget与UIImageWriteToSavedPhotosAlbum一起使用,ios,swift,uiimage,screenshot,alert,Ios,Swift,Uiimage,Screenshot,Alert,我正试图找到一种方法,让我的iOS应用程序将屏幕截图保存到摄像机上,然后弹出一个警报,告诉用户屏幕截图已成功保存 我能想到的唯一方法是使用某种形式的if/else循环(您将在下面的伪代码注释中看到),但我想不出任何语法来使用UIKit中的UIImageWriteToSavedPhotosAlbum函数。我曾在苹果的开发网站上遇到过使用completionSelector和completionTarget的建议,但我真的不知道如何使用它们,也不知道我的代码中的completionSelector和

我正试图找到一种方法,让我的iOS应用程序将屏幕截图保存到摄像机上,然后弹出一个警报,告诉用户屏幕截图已成功保存

我能想到的唯一方法是使用某种形式的if/else循环(您将在下面的伪代码注释中看到),但我想不出任何语法来使用UIKit中的
UIImageWriteToSavedPhotosAlbum
函数。我曾在苹果的开发网站上遇到过使用completionSelector和completionTarget的建议,但我真的不知道如何使用它们,也不知道我的代码中的completionSelector和completionTarget应该使用什么特定的措辞。我对斯威夫特比较陌生

有人能解释一下它们是如何工作的,以及我如何在代码中找到使用它们的语法吗

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)
}
导入UIKit
类ViewController:UIViewController{
@按下iAction func按钮(发件人:AnyObject){
presentImagePickerController()
}
}
扩展视图控制器:UIImagePickerControllerDelegate、UINavigationControllerDelegate{
func presentImagePickerController(){
让imagePickerController=UIImagePickerController()
imagePickerController.delegate=self
imagePickerController.sourceType=.PhotoLibrary
imagePickerController.allowsEditing=false
presentViewController(imagePickerController,动画:true,完成:nil)
}
func imagePickerController(picker:UIImagePickerController,didFinishPickingImage:UIImage,editingInfo:[字符串:任意对象]?){
UIImageWriteToSavedPhotosAlbum(图像,自我,“图像:didFinishSavingWitheror:contextInfo:”,无)
}
func ImagePickerController IDCancel(选择器:UIImagePickerController){
self.dismissViewControllerAnimated(真,完成:无)
}
func图像(图像:UIImage,DidFinishSavingWither错误:NSError?,上下文信息:UnsafePointer){
保护错误==nil else{
//保存图像时出错
返回
}
//已成功保存图像
}
}

@Dare检查错误的解决方案对我不起作用(Swift 2.0)

这一微小的修改确实起了作用:

func image(image: UIImage, didFinishSavingWithError: NSError?, contextInfo:UnsafePointer<Void>)       {
        if didFinishSavingWithError != nil
        {
            Helper.showNotifierInfo(DefaultTextFailed)
        }
        else
        {
            Helper.showNotifierInfo(DefaultTextSaved)
        }
    }
func图像(图像:UIImage,didFinishSavingWither错误:NSError?,上下文信息:UnsafePointer){
如果没有完成,则savingwitherror!=零
{
Helper.showNotifierInfo(DefaultTextFailed)
}
其他的
{
Helper.showNotifierInfo(DefaultTextSaved)
}
}

swift 2.2中的另一个示例

本例中的关键区别在于,具有回调函数的类必须从NSObject扩展而来(@objc也可以工作)

func writeImage(){
let responder=WriteImageToFileResponder()
响应程序.addCompletion{print(“completed”)}
让image=UIImage(颜色:.redColor(),大小:CGSize(宽度:100,高度:100))!
UIImageWriteToSavedPhotosAlbum(图像,响应程序,#选择器(WriteImageToFileResponder.image(uu∶didFinishSavingWithError:contextInfo:)),无)
}
类WriteImageToFileResponder:NSObject{
var完成:(()->无效)?
func图像(图像:UIImage,DidFinishSavingWither错误:NSError?,上下文信息:UnsameutablePointer){
打印(错误)
完成?()
}
func addCompletion(完成:(()->Void)?){
自我完成=完成
}
}

以下是一个工作示例,用于在SWIFT 3.0中,将当前视图的屏幕截图保存在camera roll中

 @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)
}

}

您有没有可能知道如何将其更新为Swift 2.1?如果contextInfo对象不是零,则更新为Swift 2.1非常好,以了解其如何被分解。我还无法将其应用于我的任何想法?UIImageWriteToSavedPhotosAlbum(imageToSave,#选择器(PreviewViewController.image(:didFinishSavingWithError:contextInfo:)),nil,nil)`并定义为`@objc func image(image:UIImage,didFinishSavingWithError错误:NSError?,contextInfo:UnsafePointer)`
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
    }
}
 @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)
}