iOS – UIImageWriteToSavedPhotosAlbum

Je voulais utiliser l'API void suivante pour écrire une image capturée dans l'album photo mais je ne suis pas très clair sur 2 des parameters

UIImageWriteToSavedPhotosAlbum ( UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo ); 

De l'explication de l'ADC:

completionTarget: optionnel; l'object dont le sélecteur doit être appelé après que l'image a été écrite dans l'album Camera Roll.

completionSelector: le sélecteur de méthode de l'object completionTarget. Cette méthode optionnelle doit être conforme à la signature suivante:

 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *) contextInfo; 

Quelle est la signification de completionTarget ici? Quelqu'un peut-il expliquer avec un exemple comment ce paramètre devrait être utilisé? Ou toute ressource qui peut me guider à travers.

  • Le completionSelector est le sélecteur (méthode) à appeler lorsque l'écriture de l'image est terminée.
  • L' completionTarget est l'object sur lequel appeler cette méthode.

Généralement:

  • Soit vous n'avez pas besoin d'être averti lorsque l'écriture de l'image est terminée (dans la plupart des cas ce n'est pas utile), donc vous utilisez nil pour les deux parameters
  • Ou vous voulez vraiment être averti quand le file image a été écrit dans l'album photo (ou s'est retrouvé avec une erreur d'écriture), et dans ce cas, vous implémentez généralement le callback (= la méthode d'appel à l'achèvement) dans le même class que vous avez appelée la fonction UIImageWriteToSavedPhotosAlbum , de sorte que le completionTarget sera généralement self

Comme l'indique la documentation, completionSelector est un sélecteur représentant une méthode avec la signature décrite dans la documentation, il doit donc avoir une signature comme:

 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *) contextInfo; 

Il ne doit pas avoir ce nom exact, mais il doit utiliser la même signature, à savoir prendre 3 parameters (le premier étant un UIImage , le second un NSError et le troisième étant du type void* ) et ne rien returnner ( void ).


Exemple

Vous pouvez par exemple déclarer et implémenter une méthode que vous pourriez appeler n'importe quoi de pareil:

 - (void)thisImage:(UIImage *)image hasBeenSavedInPhotoAlbumWithError:(NSError *)error usingContextInfo:(void*)ctxInfo { if (error) { // Do anything needed to handle the error or display it to the user } else { // .... do anything you want here to handle // .... when the image has been saved in the photo album } } 

Et quand vous appelez UIImageWriteToSavedPhotosAlbum vous l'utiliserez comme ceci:

 UIImageWriteToSavedPhotosAlbum(theImage, self, // send the message to 'self' when calling the callback @selector(thisImage:hasBeenSavedInPhotoAlbumWithError:usingContextInfo:), // the selector to tell the method to call on completion NULL); // you generally won't need a contextInfo here 

Notez le multiple ':' dans la @selector(...) . Les deux-points font partie du nom de la méthode, donc n'oubliez pas d'append ces ':' dans le @selector (event the trainling) quand vous écrivez cette ligne!