如何将NSMutableArray转换为NSString?

时间:2012-04-21 08:13:43

标签: iphone objective-c ios nsmutablearray nsarray

我正在尝试将NSMutableArray转换(或复制?)为NSString。我想我的问题是 我真的不理解NSString的结构。转换后我想 附在电子邮件正文中。这是我的代码:

- (IBAction)sendEmail
{
    NSLog(@"sendEmail");
    [textView resignFirstResponder];
    [textView1 resignFirstResponder];
    if ([MFMailComposeViewController canSendMail])
    {
        // set the sendTo address
        NSMutableArray *recipients = [[NSMutableArray alloc] initWithCapacity:1];
        [recipients addObject:@"example@yahoo.com"];
        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];
    }
}

3 个答案:

答案 0 :(得分:9)

编辑:

阅读完评论之后,很明显你要做的是归档/取消归档包含各种对象的数组。所以,你应该尝试使用:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

获取NSData对象,然后您可以将其作为带有电子邮件的附件(或您需要的任何其他持久层)发送。

请记住,只有当存储在数组中的对象支持NSCoding协议时,此方法才有效(您可以在参考中检查您正在使用的每种类型:它清楚地列出了所有支持的协议) 。考虑到你说你的对象已经存储为NSData,应该没有问题。只需归档数组,以便以后可以根据需要取消归档。

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

老答案:

我不确定我是否理解您的问题,但使用componentsJoinedByString:

怎么办?

E.g:

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

这样做,数组的内容(假设它由字符串组成)将显示为字符串列表。如果您使用description,您的数组将被转换为字符串,而不会对其格式进行太多控制(它将添加花括号和其他语法糖)。

答案 1 :(得分: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:@"example@yahoo.com"];

        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方法,并在结果字符串中使用它的输出。

答案 2 :(得分:1)

取决于您希望字符串具有的格式。你总是可以像这样使用数组的描述:

NSString *myString = [myArray description];