2016-07-05 1 views
3

Я работаю через учебник Project10 и пытаюсь преобразовать его в Swift 3.0, когда я иду. Это обычно прямой случай использования UIImagePickerController, чтобы выбрать изображение, а затем сохранить его в Справочник Документов.Swift 3.0 Запись двоичных данных изображения с записью (toFile: atomically :)

Я получаю ошибку на этой линии:

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

Начавшаяся жизнь, как это:

jpegData.writeToFile(imagePath, atomically: true) 

Ошибка хочет заменить мои аргументы:

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

Я уверен, что это не то, что я хочу, и это приводит к дальнейшим ошибкам String/URL. Эти два метода в полном объеме:

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 
} 

Я просто путаюсь со строками, NSStrings и URL?

+0

Я думаю, что один из методов: '.write (to:, atomically:, encoding:)' ... вы можете использовать это как '.write (to: imagePath, atomically: true, encoding: .utf8)' –

+0

Когда Я пытаюсь, чтобы я получил ошибку: дополнительный аргумент «кодирование» в вызове. Я видел этот метод в документах ранее, но забыл попробовать. Спасибо, в любом случае. – Magnas

ответ

3

Ну я сделал некоторый прогресс со следующим:

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

Гадкий и провисание с возможной ошибкой (на данный момент), но с использованием версии предлагаемого метода El Capitan и преобразование строки в URL трогает меня вперед.

+0

Для меня я использовал '.atomicWrite', а не' .dataWritingAtomic' - я не знаю, является ли это изменением имен между соответствующей бета-версией в то время и окончательной версией Xcode 8 и т. Д., Или если она отличается от версии API-интерфейсов macOS. –

+0

интересно, из источника WritingOptions чуть выше atomWrite: «Опции со старыми именами для методов записи NSData. Пожалуйста, прекратите использовать эти старые имена». Так что теперь это просто «атомный». –

+0

Для меня, если data.write (to: путь, опции: [.atomic]) отлично работает – nights

0

Этот код для Swift 3:

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

Вы можете сохранить изображение, как описано выше в вашем мобильном thrugh приложение.