2014-12-09 3 views
6

Попытка трудно получить UIImageWriteToSavedPhotosAlbum работать в быстром https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/index.html#//apple_ref/c/func/UIImageWriteToSavedPhotosAlbumUIImageWriteToSavedPhotosAlbum Selector Синтаксис Issue

документация, к сожалению, только в Objective C.

Вот мой код:

func saveImage() 
{ 
    UIImageWriteToSavedPhotosAlbum(uiimage, self, "saveImageComplete:::", nil) 
} 

func saveImageComplete(image:UIImage,err:NSError,context:UnsafePointer<()>) 
{ 
    loadLastPhotoIntoGalleryIcon() 
} 

Но проблема в том, что он выбрасывает исключение NSInvalidArgumentException с непризнанным селектором:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'app.PhotoEditor<0x14a1e400> does not respond to selector 
saveImageComplete:::' 

Можете ли вы посоветовать, что не так с моим синтаксисом и как я правильно определил этот селектор? Из того, что я понимаю, каждый: представляет 1 аргумент, который ожидает метод, и поскольку у него есть 3 параметра, я дал ему 3: s.

Спасибо!

+0

Возможный дубликат: [@selector() в Swift?] (Http://stackoverflow.com/q/24007650/643383) – Caleb

+0

Я поддержал этот ответ несколько месяцев назад, его отказ от моего метода с несколькими параметрами – Aggressor

+0

Как и в случае if У меня есть метод только с 1 параметром, и я делаю «methodName:», который работает отлично. Второй я перехожу на 1, я сталкиваюсь с проблемами – Aggressor

ответ

3

Если ваш метод был методом Objective-C, селектор будет чем-то вроде «saveImageCompleteImage: err: context:». Вы должны помнить, что параметры являются частью имени в Objective-C, поэтому "saveImageComplete:::" не указывает метод, который можно было бы назвать saveImageComplete(image:UIImage,err:NSError,context:UnsafePointer<()>) в Swift.

+0

Это правильно. Я ошибочно думал, что логика задания параметров с: перенесена из Objc, меняется на полное имя метода «saveImageComplete: err: context:» (вы можете оставить первый параметр). Причина путаницы в том, что, быстро, вы можете оставить первый параметр с: а остальные должны быть объяснены в строке! – Aggressor

4

Правильный код/​​селектор UIImageWriteToSavedPhotosAlbum здесь:

func onYesClicked(action:Int){ 
    // i'm using optional image here just for example 
    if let image = getImage() { 
     UIImageWriteToSavedPhotosAlbum(
      image, self, 
      Selector("image:didFinishSavingWithError:contextInfo:"), 
      nil) 
    } 
} 

func image(
    image: UIImage!, 
    didFinishSavingWithError error:NSError!, 
    contextInfo:UnsafePointer<Void>) 
{ 
    // process success/failure here 
} 

Вот самый синтаксис уточненный, 2016

@IBAction func clickedSaveToUsersCameraRoll() 
    { 
    print("actually saving yourImage.image to the camera roll, 2016.") 
    UIImageWriteToSavedPhotosAlbum(
     yourImage.image!, self, 
     #selector(savedOK(_:didFinishSavingWithError:contextInfo:)), 
     nil) 
    } 

func savedOK(
     image:UIImage!, 
     didFinishSavingWithError error:NSError!, 
     contextInfo:UnsafePointer<Void>) 
    { 
    print("Wrote photo ok") 
    } 
+0

спасибо за это! – Fattie

9

Выше доли не имеет работы Swift3. Попробуйте это для тех, кто борется с Swift3 Syntax's

Действие:

@IBAction func saveToPhotos(_ sender: AnyObject) { 

    UIImageWriteToSavedPhotosAlbum(yourImageView.image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) 
} 

Цель:

func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) { 

    if error == nil { 
     let ac = UIAlertController(title: "Saved!", message: "Image saved to your photos.", preferredStyle: .alert) 
     ac.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
     present(ac, animated: true, completion: nil) 
    } else { 
     let ac = UIAlertController(title: "Save error", message: error?.localizedDescription, preferredStyle: .alert) 
     ac.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
     present(ac, animated: true, completion: nil) 
    } 
} 

Обратитесь по ссылке для получения дополнительной осветления https://www.hackingwithswift.com/read/13/5/saving-to-the-ios-photo-library

0

Вы можете сделать это по телефону одного строка кода также

UIImageWriteToSavedPhotosAlbum(imageToSave!,self,nil,nil) 
Смежные вопросы