objective-c - pasta - nao consigo salvar arquivos no meu iphone



Salvar uma imagem para pasta de documentos do aplicativo de UIView no IOS (4)

Eu tenho um UIImageView que permite ao usuário colocar e manter uma imagem até que ela possa ser salva. O problema é que não consigo descobrir como realmente salvar e recuperar a imagem que coloquei na exibição.

Eu recuperei e coloquei a imagem no UIImageView assim:

//Get Image 
- (void) getPicture:(id)sender {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = (sender == myPic) ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage (UIImage *)image editingInfo:(NSDictionary *)editingInfo {
    myPic.image = image;
    [picker dismissModalViewControllerAnimated:YES];
}

Ele exibe a imagem selecionada no meu UIImageView muito bem, mas não tenho idéia de como salvá-lo. Estou salvando todas as outras partes da visualização (principalmente UITextfield) no Core Data. Eu pesquisei e pesquisei e tentei muitos códigos que as pessoas sugeriram, mas ou eu não estou inserindo o código corretamente ou essas sugestões não funcionam com a configuração do meu código. É provável que seja o primeiro. Eu gostaria de salvar a imagem no UIImageView usando a mesma ação (um botão salvar) que estou usando para salvar o texto no UITextFields. Aqui está como eu estou salvando minhas informações do UITextField:

// Handle Save Button
- (void)save {

    // Get Info From UI
    [self.referringObject setValue:self.myInfo.text forKey:@"myInfo"];

Como eu disse anteriormente, eu tentei vários métodos para fazer isso funcionar, mas não consigo entender. Pela primeira vez na vida, quis causar danos físicos a um objeto inanimado, mas consegui me conter.

Eu gostaria de ser capaz de salvar a imagem que o usuário coloca no UIImageView na pasta de documentos do aplicativo e, em seguida, ser capaz de recuperá-lo e colocá-lo em outro UIImageView para exibição quando o usuário envia essa visão para a pilha. Qualquer ajuda é muito apreciada!


Answer #1

Versão Swift 3.0

let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString

let img = UIImage(named: "1.jpg")!// Or use whatever way to get the UIImage object
let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg"))// Change extension if you want to save as PNG

do{
    try UIImageJPEGRepresentation(img, 1.0)?.write(to: imgPath, options: .atomic)//Use UIImagePNGRepresentation if you want to save as PNG
}catch let error{
    print(error.localizedDescription)
}

Answer #2

Em Swift:

let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true)
if let path = paths[0]?.stringByAppendingPathComponent(imageName) {
    do {
        try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic)
    } catch {
        return
    }
}

Answer #3

Esta é a resposta da Fangming Ning para o Swift 4.2 , atualizada com um método recomendado e mais Swifty para recuperar o caminho do diretório de documentos e com melhor documentação. Créditos para Fangming Ning pelo novo método também.

guard let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
    return
}

//Using force unwrapping here because we're sure "1.jpg" exists. Remember, this is just an example.
let img = UIImage(named: "1.jpg")!

// Change extension if you want to save as PNG.
let imgPath = documentDirectoryPath.appendingPathComponent("1.jpg")

do {
    //Use .pngData() if you want to save as PNG.
    //.atomic is just an example here, check out other writing options as well. (see the link under this example)
    //(atomic writes data to a temporary file first and sending that file to its final destination)
    try img.jpegData(compressionQuality: 1)?.write(to: imgPath, options: .atomic)
} catch {
    print(error.localizedDescription)
}

Confira todas as possíveis opções de gravação de dados aqui.


Answer #4

Swift 4 com extensão

extension UIImage{

func saveImage(inDir:FileManager.SearchPathDirectory,name:String){
    guard let documentDirectoryPath = FileManager.default.urls(for: inDir, in: .userDomainMask).first else {
        return
    }
    let img = UIImage(named: "\(name).jpg")!

    // Change extension if you want to save as PNG.
    let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("\(name).jpg").absoluteString)
    do {
        try UIImageJPEGRepresentation(img, 0.5)?.write(to: imgPath, options: .atomic)
    } catch {
        print(error.localizedDescription)
    }
  }
}

Exemplo de uso

 image.saveImage(inDir: .documentDirectory, name: "pic")