2012-04-21 9 views
5

Estoy tratando de convertir (o copiar?) Un NSMutableArray en un NSString. Supongo que mi problema es que realmente no entiendo la estructura de un NSString. Después de la conversión quiero adjunto en el cuerpo del correo electrónico. Aquí está mi código:¿Cómo puedo convertir NSMutableArray en NSString?

- (IBAction)sendEmail 
{ 
    NSLog(@"sendEmail"); 
    [textView resignFirstResponder]; 
    [textView1 resignFirstResponder]; 
    if ([MFMailComposeViewController canSendMail]) 
    { 
     // set the sendTo address 
     NSMutableArray *recipients = [[NSMutableArray alloc] initWithCapacity:1]; 
     [recipients addObject:@"[email protected]"]; 
     MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init]; 
     controller.mailComposeDelegate = self; 
     [controller setSubject:@"Iphone Game"]; 
     NSString *string = [string appendString:[NSString stringWithFormat:"%@", [viewArray objectAtIndex:i]]]; 
     [controller setMessageBody:string isHTML:NO]; 
     [controller setToRecipients:recipients]; 
     [self presentModalViewController:controller animated:YES]; 
     [controller release]; 
    } 
    else 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" 
message:@"Your device is not set up for email." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
     [alert show]; 
     [alert release]; 
    } 
} 
+2

¿Cuál es su problema? ¿Puede explicarlo claramente? – Dinesh

+0

mismo como este: -http: //stackoverflow.com/questions/8802543/how-to-convert-nsmutablearray-into-nsstring/8802630#8802630 – Leena

Respuesta

9

EDIT:

después de leer su comentario, es bastante claro que lo que usted está tratando de hacer es archivar/desarchivándolos una matriz que contiene los objetos de diversa tipos. Por lo tanto, usted debe tratar de usar:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 

para obtener un objeto NSData que entonces se puede enviar como un archivo adjunto con un mensaje de correo electrónico (o en cualquier otra capa de persistencia que necesita).

Tenga en cuenta que este enfoque solo funcionará si los objetos almacenados en la matriz admiten el protocolo NSCoding (puede verificarlo en la referencia para cada tipo que esté utilizando: enumera claramente todos los protocolos admitidos). Considerado que dice que su objeto ya está almacenado como NSData, no debería haber ningún problema. Simplemente archive la matriz, por lo que podrá desarchivarla más tarde, si es necesario.

Si tiene algún tipo personalizado que no admite NSCoding, deberá implementarlo como se describe en Encoding and Decoding Objects.

vieja respuesta:

No estoy seguro de entender su problema, pero ¿qué pasa con el uso de componentsJoinedByString:

Ej:

NSString *string = [viewArray componentsJoinedByString:@"\n"]; 

Haciendo de esta manera, el contenido de la matriz (siempre y cuando está hecho de cadenas) se presentará como una lista de cadenas. Si usa description, su matriz se convertirá en una cadena sin darle mucho control sobre su formato (agregará llaves y otro azúcar sintáctico).

+1

Sospecho que probablemente debería ser 'NSString * string = [viewArray componentsJoinedByString: @" \ n "];'. Mirando el código en la publicación original no hay una 'cadena' preexistente para agregar. – mttrb

+0

@mttrb: tienes toda la razón, gracias! ah, copiar/pegar ... – sergio

+0

por favor, vea mi edición ... – sergio

1

Depende del formato que desee que tenga su cadena. Siempre se puede utilizar la descripción de la matriz de esta manera:

NSString *myString = [myArray description]; 
+0

También todos estos objetos personalizados se almacenan en mi nsmutablearray en formato de Nsdata. – jamil

2

Sospecho que lo que quería hacer era crear un ciclo en todos los elementos en viewArray y anexarlos a un NSString string. Sin embargo, como ha sugerido @sergio, creo que componentsJoinedByString sería una mejor opción.

Esto es lo que su método se vería con ese cambio, también he limpiado algunas otras partes del método. Parece que hubo una pérdida de memoria, recipients, en su versión original.

- (IBAction)sendEmail 
{ 
    NSLog(@"sendEmail"); 

    [textView resignFirstResponder]; 

    [textView1 resignFirstResponder]; 

    if ([MFMailComposeViewController canSendMail]) 
    { 
     // set the sendTo address 
     NSArray *recipients = [NSArray arrayWithObject:@"[email protected]"]; 

     MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init]; 
     controller.mailComposeDelegate = self; 

     [controller setSubject:@"Iphone Game"]; 

     NSString *string = [viewArray componentsJoinedByString:@"\n"]; 

     [controller setMessageBody:string isHTML:NO]; 

     [controller setToRecipients:recipients]; 

     [self presentModalViewController:controller animated:YES]; 
     [controller release]; 

    } 
    else 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" 
                 message:@"Your device is not set up for email." 
                 delegate:self 
               cancelButtonTitle:@"OK" 
               otherButtonTitles: nil]; 

     [alert show]; 

     [alert release]; 
    } 

} 

Esto combinar los elementos de la viewArray y colocar una nueva línea \n entre cada elemento. Puede reemplazar el @"\n" con @"" o @" " dependiendo de exactamente lo que desea hacer. Si los elementos de la matriz no son NSString s, se invocará el método de los elementos description y se utilizará la salida en la cadena resultante.