2012-04-21 49 views
5

我想将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 2012-04-21 08:20:34

+0

相同是这样的:-http://stackoverflow.com/questions/8802543/how-to-convert-nsmutablearray-into-nsstring/8802630#8802630 – Leena 2012-04-21 09:51:05

回答

9

编辑:

阅读您的评论后,它是非常清楚,你正在试图做的是存档/解除存档包含的各种对象的数组种。所以,你应该尝试使用:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 

得到一个NSData对象,然后你可以电子邮件附件的形式发送(或任何你需要的其他持久层)。请记住,只有当存储在阵列中的对象支持协议时(您可以在参考中检查您使用的每种类型:它清楚地列出了所有支持的协议),该方法才能正常工作。考虑到你说你的对象已经存储为NSData,应该没有问题。只需将数组归档,如果需要,您可以稍后将其归档。

如果您有一些不支持NSCoding的自定义类型,则需要按照Encoding and Decoding Objects中所述执行该类型。

OLD答:

我不知道我理解你的问题,但关于使用componentsJoinedByString:

例如:What:

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

做这样的,你的阵列的内容(只要它由字符串组成)将作为字符串列表呈现。如果你使用description,你的数组将被转换成一个字符串,而不会对你的格式有太大的控制(它会添加大括号和其他语法糖)。

+1

我怀疑它可能应该是'NSString * string = [viewArray componentsJoinedByString:@“\ n”];'。查看原始文章中的代码,没有预先存在的'string'来追加。 – mttrb 2012-04-21 09:24:06

+0

@mttrb:你完全正确,谢谢!啊,野生的复制/粘贴... – sergio 2012-04-21 09:26:00

+0

请参阅我的编辑... – sergio 2012-05-02 08:18:24

1

取决于你想要你的字符串的格式。你总是可以使用数组的描述是这样的:

NSString *myString = [myArray description]; 
+0

所有这些自定义对象都存储在我Nsmutablearray Nsdata甲酸。 – jamil 2012-05-02 07:55:43

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,那么会调用元素description方法,并在结果字符串中使用该方法的输出。