2016-07-05 10 views
3

Ich arbeite durch ein Tutorial Project10 und versuche, es in Swift 3.0 zu konvertieren, wie ich gehe. Es ist der normalerweise einfache Fall, einen UIImagePickerController zu verwenden, um ein Bild auszuwählen und es dann in dem Documents Directory zu speichern.Swift 3.0 Schreiben binärer Bilddaten mit schreiben (toFile: atomically :)

Ich erhalte einen Fehler auf dieser Linie:

jpegData.write(toFile: imagePath, atomically: true) 

Welche begann sein Leben als dies:

jpegData.writeToFile(imagePath, atomically: true) 

Der Fehler will meine Argumente ersetzen:

jpegData.write(to: imagePath, options: true) 

Ich bin mir ziemlich sicher, dass das nicht das ist, was ich will, und es führt sowieso zu weiteren String/URL-Fehlern. Die zwei Methoden, in vollem Umfang sind:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    var newImage: UIImage 

    if let possibleImage = info[UIImagePickerControllerEditedImage] as? UIImage { 
     newImage = possibleImage 
    } else if let possibleImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     newImage = possibleImage 
    } else { 
     return 
    } 

    let imageName = NSUUID().uuidString 
    let imagePath = getDocumentsDirectory().appendingPathComponent(imageName) 

    if let jpegData = UIImageJPEGRepresentation(newImage, 80) { 
     jpegData.write(toFile: imagePath, atomically: true) 
    } 

    dismiss(animated: true, completion: nil) 
} 

func getDocumentsDirectory() -> NSString { 
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 
    let documentsDirectory = paths[0] 
    return documentsDirectory 
} 

Bin ich einfach verwirrt mit Strings, NSStrings und URLs?

+0

Ich denke, eine Methode ist '.write (to:, atomically,, encoding:)' ... Sie können das verwenden wie '.write (zu: imagePath, atomically: true, encoding: .utf8)' –

+0

Wann Ich versuche, dass ich Error: Extra Argument "Codierung" in Anruf bekomme. Ich hatte diese Methode früher in den Dokumenten gesehen, aber vergessen, es zu versuchen. Danke trotzdem. – Magnas

Antwort

3

Nun, ich habe einige Fortschritte bei den folgenden gemacht:

let imagePath = getDocumentsDirectory().appendingPathComponent(imageName) 
let path = URL(fileURLWithPath: imagePath) 
if let jpegData = UIImageJPEGRepresentation(newImage, 80) { 
    try! jpegData.write(to: path, options: [.dataWritingAtomic]) 
} 

Hässlich und schlaff mit dem möglichen Fehler (bis jetzt), aber eine Version von El Capitan vorgeschlagenen Methode und den String in eine URL Umwandlung bewegt mich nach vorne.

+0

Für mich habe ich '.atomicWrite' anstelle von' .dataWritingAtomic' verwendet - ich weiß nicht, ob das eine Namensänderung zwischen der jeweiligen Beta zu der Zeit und der endgültigen Version von Xcode 8 etc. ist, oder ob es sich zwischen den beiden unterscheidet Versionen der MacOS APIs. –

+0

Interessanterweise aus der Quelle "WritingOptions" oberhalb von atomicWrite: "Optionen mit alten Namen für NSData-Schreibmethoden. Bitte hören Sie auf, diese alten Namen zu verwenden." So, jetzt ist es nur "atomar". –

+0

Für mich, wenn data.write (zu: Pfad, Optionen: [.atomic]) funktioniert – nights

0

Dieser Code ist für Swift 3: Bild wie oben in Ihrem Mobil thrugh Ihre App

if let jpegData = UIImageJPEGRepresentation(iconImage!, 80) { 
     do { 
      try jpegData.write(to: imagePath!) 

     } catch { 
      print("write image failed")  
     } 
    } 
0
if (UIImage(data: data!) != nil) 
      { 
       let Image = UIImage(data: data!) //image data 

       self.ImageView.image = Image //Image view 

       let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
       if documentsPath.count > 0{ 
        let documentsDirectory = documentsPath[0] 
        let savePath = documentsDirectory + "/name.jpg" 
        do{ 
         try UIImageJPEGRepresentation(Image!, 1)?.writeToURL(NSURL(fileURLWithPath: savePath), atomically: true) 
        }catch{ 
         //process errors 
        } 
       } 
      } 

Sie speichern können.