2012-04-21 2 views
5

Я пытаюсь преобразовать (или скопировать?) A NSMutableArray в NSString. Я думаю, моя проблема - , что я не совсем понимаю структуру NSString. После преобразования я хочу, чтобы приложил его к электронной почте. Вот мой код:Как преобразовать NSMutableArray в 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

В чем ваша проблема, можете ли вы объяснить ясно? – Dinesh

+0

такие же: -http: //stackoverflow.com/questions/8802543/how-to-convert-nsmutablearray-into-nsstring/8802630#8802630 – Leena

ответ

9

EDIT:

после прочтения ваш комментарий, это в значительной степени ясно, что то, что вы пытаетесь сделать, это архивирование/разархивировав массив, содержащий объекты различного виды. Таким образом, вы должны попробовать использовать:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 

получить NSData объект, который затем можно отправить как вложение в сообщении электронной почты (или в любой другой инерции слоя вам нужен).

Имейте в виду, что этот подход будет работать только в том случае, если объекты, хранящиеся в массиве, поддерживают протокол NSCoding (вы можете проверить, что в ссылке для каждого используемого вами типа: в нем четко перечислены все поддерживаемые протоколы). Считается, что вы говорите, что ваш объект уже сохранен как NSData, не должно быть никаких проблем. Просто заархивируйте массив, так что вы сможете его разблокировать позже, если потребуется.

Если у вас есть пользовательский тип, который не поддерживает NSCoding, вам необходимо его реализовать, как описано в Encoding and Decoding Objects.

OLD ОТВЕТ:

Я не уверен, я понимаю вашу проблему, но что об использовании componentsJoinedByString:

Например:

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

Doing как это, содержание вашего массива (при условии его состоит из строк) будет представлен в виде списка строк. Если вы используете description, ваш массив будет преобразован в строку, не давая вам большого контроля над ее форматом (он добавит фигурные скобки и другой синтаксический сахар).

+1

Я подозреваю, что это, вероятно, должно быть просто 'NSString * string = [viewArray componentsJoinedByString: @" \ n "];'. Глядя на код в исходном сообщении, перед существующей 'string' нет. – mttrb

+0

@mttrb: вы совершенно правы, спасибо! ah, wild copy/paste ... – sergio

+0

, пожалуйста, см. мое редактирование ... – sergio

1

В зависимости от формата, который требуется для вашей строки. Вы всегда можете использовать описание этого массива, как это:

NSString *myString = [myArray description]; 
+0

Также все эти пользовательские объекты хранятся в моем nsmutablearray в Nsdata formate. – jamil

2

Я подозреваю, что вы хотели создать петлю на всех элементах в viewArray и добавить их в NSString string. Однако, как предположил @sergio, я думаю, что componentsJoinedByString будет лучшим вариантом.

Это то, что ваш метод будет выглядеть с этим изменением, я также очистил некоторые другие части метода. Похоже, в исходной версии произошла утечка памяти, 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]; 
    } 

} 

Это будет сочетать в себе элементы viewArray и поместить новую строку \n между каждым элементом. Вы можете заменить @"\n" на @"" или @" " в зависимости от того, что вы хотите сделать. Если элементы массива не являются NSString s, тогда будут вызываться элементы description и вывод того, что используется в результирующей строке.

Смежные вопросы