2012-10-09 39 views
10

Finalmente lo he estado haciendo a través de la documentación (bastante triste) de Apple sobre la nueva clase UIActivityViewController y el protocolo UIActivityItemSource, y estoy tratando de enviar diferentes conjuntos de datos a diferentes acciones llamadas desde la vista de actividad. Para simplificar las cosas, estoy viendo dos cosas.Texto inicial y paperclipped-URL para la acción en UIActivityViewController & UIActivityItemSource?

  1. Acción de publicación en Facebook, que debería decir "¡Mira esto!" y también adjunte una URL a la publicación (con ese lindo clip pequeño).
  2. Una acción de publicación de Twitter, que debería decir "¡Mira esto, con #hashtag!" y también adjunte esa misma URL (con el mismo clip).

Aquí está el código que he implementado en este momento.

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { 
    if ([activityType isEqualToString:UIActivityTypePostToFacebook]) { 
     return @"Check this out!"; 
    } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) { 
     return @"Check this out, with #hashtag!"; 
    } 

    return @""; 
} 

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { 
    return @""; 
} 

Y luego cuando configuro este controlador de vista de actividad (está en la misma clase), esto es lo que hago.

UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:@[self] applicationActivities:nil]; 
[self presentViewController:activityView animated:YES completion:nil]; 

Mi dilema es cómo colocar que NSURL objeto. Es relativamente fácil cuando se llama a los modos modals de iOS 6 SL-class; simplemente llame a los métodos individuales para adjuntar una URL o una imagen. ¿Cómo voy a hacer esto aquí?

me habrá dado cuenta de que en vez de volver NSString objetos de -activityViewController:itemForActivityType, si vuelvo a sólo NSURL objetos, que aparecen con un clip que, sin el cuerpo del texto en el puesto. Si devuelvo una matriz de esos dos elementos, no aparece nada.

Respuesta

15

Evidentemente fue tan simple como esto: pasar una matriz al primer argumento de la llamada de inicio UIActivityViewController, con cada elemento de la matriz manejando un tipo de datos diferente que terminará en la pantalla de composición. self maneja el texto, y el segundo objeto (el NSURL) adjunta la URL.

NSArray *items = @[self, [NSURL URLWithString:@"http://this-is-a-url.com"]]; 
UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; 
[self presentViewController:activityView animated:YES completion:nil]; 

Realmente desearía que hubiera más sobre esto, pero aquí está.

+3

Tenga en cuenta que un solo UIActivityItemSource solo puede devolver un marcador de posición para un único dato (no devolver NSArrays para 'activityViewControllerPlaceHolderItem:'. Para obtener más información, consulte esta pregunta: http://stackoverflow.com/questions/13029340/uiactivityitemsource- protocole-set-complex-object – Doug

+0

Gracias por el puntero a esa otra pregunta. He olvidado más o menos 'UIActivityViewController' por ahora (he perdido demasiadas horas haciendo que haga lo que quiero), ya que es tan inflexible, pero esa subclase mencionada en su enlace parece un paso definitivo en la dirección correcta. –

+0

He estado luchando con este mismo problema. Parece extraño que no definieran las constantes para los tipos de datos posibles, de modo que pudiéramos marcar contra esos. UIActivityViewController es una gran idea, pero la implementación es un poco rara en este momento. – poetmountain

Cuestiones relacionadas