2012-04-21 12 views
5

Próbuję przekonwertować (lub skopiować?) NSMutableArray na NSString. Domyślam się, że mój problem to , którego naprawdę nie rozumiem struktury NSString. Po konwersji chcę załączyć go w treści wiadomości e-mail. Oto mój kod:Jak przekonwertować NSMutableArray na 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

Jaki jest twój problem, czy możesz wyjaśnić jednoznacznie? – Dinesh

+0

takie same jak to: -http: //stackoverflow.com/questions/8802543/how-to-convert-nsmutablearray-into-nsstring/8802630#8802630 – Leena

Odpowiedz

9

EDIT:

po przeczytaniu Twojego komentarza, to jest dość dużo oczywiste, że to, co staramy się robić to archiwizacji/dearchiwizacja tablicę zawierającą obiekty różne rodzaje. Tak, należy spróbować użyć:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 

aby uzyskać obiekt NSData które można następnie wysłać jako załącznik do wiadomości e-mail (lub w jakikolwiek inny trwałości warstwa trzeba).

Należy pamiętać, że to podejście będzie działać tylko wtedy, gdy obiekty przechowywane w tablicy obsługują protokół NSCoding (można to sprawdzić w odnośniku dla każdego używanego typu: wyraźnie wymienia wszystkie obsługiwane protokoły). Uznając, że mówisz, że twój obiekt jest już przechowywany jako NSData, nie powinno być problemu. Po prostu zarchiwizuj tablicę, aby później móc ją zarchiwizować, jeśli to konieczne.

Jeśli masz niestandardowy typ, który nie obsługuje NSCoding, musisz go zaimplementować zgodnie z opisem w sekcji Encoding and Decoding Objects.

OLD ODPOWIEDŹ:

Nie jestem pewien, czy rozumiem problemu, ale co na temat korzystania componentsJoinedByString:

np

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

Robi tak, treść swojej tablicy (pod warunkiem, że składa się z ciągów) zostanie przedstawiony jako lista ciągów znaków. Jeśli użyjesz description, twoja tablica zostanie przekonwertowana na ciąg znaków, nie dając ci dużej kontroli nad jego formatem (doda klamry nawiasy klamrowe i inny cukier syntaktyczny).

+1

Podejrzewam, że prawdopodobnie powinien to być 'NSString * string = [viewArray componentsJoinedByString: @" \ n "];'. Patrząc na kod w oryginalnym wpisie, nie ma istniejącego "ciągu", do którego można się dołączyć. – mttrb

+0

@mttrb: jesteś całkowicie poprawny, dzięki! ah, dzika kopia/wklej ... – sergio

+0

proszę, zobacz moją edycję ... – sergio

1

Zależy od formatu, jaki ma mieć ciąg. Zawsze możesz użyć opisu tablicy jest tak:

NSString *myString = [myArray description]; 
+0

Również wszystkie te niestandardowe obiekty są przechowywane w moim pliku nsmutablearray w Natei Formate. – jamil

2

Podejrzewam, że chciałeś utworzyć pętlę na wszystkich elementach w viewArray i dołączyć ją do NSString string. Jednak, jak zasugerował @sergio, myślę, że lepszym rozwiązaniem byłby wariant componentsJoinedByString.

Tak wyglądała twoja metoda z tą zmianą, wyczyściłem też inne części metody. Wygląda na to, że w oryginalnej wersji wystąpił wyciek pamięci: recipients.

- (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]; 
    } 

} 

to będzie łączyć elementy viewArray i umieścić nową linię \n między każdym elementem. Można zamienić @"\n" na @"" lub w zależności od tego, co dokładnie chcesz zrobić. Jeżeli elementy tablicy nie są w stanie wywołać metody , to wyjście tej metody zostanie użyte w wynikowym łańcuchu.