Проблема с прикреплением файла CSV к цели электронной почты — C

Я использую следующий IBAction для прикрепления CSV-файла, состоящего из некоторых простых данных квитанции, к электронной почте, однако, когда открывается представление компоновщика электронной почты, в разделе тела появляется серый файл, и когда я фактически отправляю сообщение сообщение отправляется без вложений вообще.

Вот мой код:

    - (IBAction)actionEmailComposer {
    NSLog(@"Receipts Count: %d", [receipts count]);
    //Create CSV File
    NSMutableString *csvString = [[NSMutableString alloc] init];
    [csvString appendString:@"Date,Business,Category,Paid By,Note, Number,Currency, Amount"];

    for (int i = 0; i < [receipts count]; i++){

        [csvString appendString: [[receipts objectAtIndex:i] receiptDate]];
        [csvString appendString: [[receipts objectAtIndex:i] business]];
        [csvString appendString: [[receipts objectAtIndex:i] category]];
        [csvString appendString: [[receipts objectAtIndex:i] paidBy]];
        [csvString appendString: [[receipts objectAtIndex:i] note]];
        [csvString appendString: [[receipts objectAtIndex:i] number]];
        [csvString appendString: [[receipts objectAtIndex:i] currency]];
        [csvString appendString: [[receipts objectAtIndex:i] amount]];

    }

    [csvString writeToFile:@"test.csv" atomically:YES encoding:NSUTF8StringEncoding error:NULL];

    if ([MFMailComposeViewController canSendMail]) {

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//        NSString *recipient = [defaults objectForKey:@"reportsEmail"];
        NSString *recipient = @"[email protected]";
        NSArray *recipients = [NSArray arrayWithObjects:recipient, nil];

        MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
        mailViewController.mailComposeDelegate = self;
        [mailViewController setSubject:@"CSV Export"];
        [mailViewController setToRecipients:recipients];
        [mailViewController setMessageBody:@"" isHTML:NO];
        mailViewController.navigationBar.tintColor = [UIColor blackColor];
        NSData *myData = [NSData dataWithContentsOfFile:@"test.csv"];

        [mailViewController addAttachmentData:myData 
                                     mimeType:@"text/csv" 
                                     fileName:@"test"];

        [self presentModalViewController:mailViewController animated:YES];

    }
    //Display alert to the user
    else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Can't Send Mail"
                                                            message:@"Device is unable to send email in its current state." 
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK" 
                                                  otherButtonTitles:nil];

        [alertView show];
    }

}

csvString выводит:

Дата,Бизнес,Категория,Кем оплачено,Примечание,Номер,Валюта,Сумма"17 июля 2012","То","Категория 1","Чек","Обед","726269","GBP","100.00 "

Итак, есть существующие данные, они просто не прикрепляются должным образом, может ли кто-нибудь объяснить, что здесь происходит?

Спасибо,

Джек


person Jack Nutkins    schedule 17.07.2012    source источник
comment
Это ужасный способ создания stringToWrite. Ради моего спокойствия, пожалуйста, по крайней мере, используйте изменяемую строку и добавьте к ней.   -  person Nikolai Ruhe    schedule 17.07.2012
comment
Хорошо, я отредактировал свой код для вашего спокойствия, спасибо.   -  person Jack Nutkins    schedule 17.07.2012
comment
Спасибо, я чувствую облегчение ;) Я полагаю, вы оставили кавычки и так для краткости?   -  person Nikolai Ruhe    schedule 17.07.2012


Ответы (2)


Попробуйте этот код

            arr_email=[[NSMutableArray alloc] initWithArray:[objDatabase lookupAllForSQL:@"select * from password"]];


    NSString *mystr=@"";
    NSString *str_type;
    NSString *str_name;
    NSString *str_user;
    NSString *str_pwd;
    NSString *str_url;
    NSString *str_descr;
    NSString *csvstr;

    csvstr=[NSString stringWithFormat:@"Account Type,Account Name,UserName/Card No,Password/Pin No, URL/Other Info,Description"];

    for (int i=0; i<[arr_email count]; i++) {
        NSMutableDictionary *dict = [arr_email objectAtIndex:i];

        str_type=[NSString stringWithFormat:@"%@",[dict objectForKey:@"AccountType"]];
        str_name=[NSString stringWithFormat:@"%@",[dict objectForKey:@"AccountName"]];
        str_user=[NSString stringWithFormat:@"%@",[dict objectForKey:@"UserName"]];
        str_pwd=[NSString stringWithFormat:@"%@",[dict objectForKey:@"Password"]];
        str_url=[NSString stringWithFormat:@"%@",[dict objectForKey:@"Url"]];
        str_descr=[NSString stringWithFormat:@"%@",[dict objectForKey:@"Description"]];

         mystr=[NSString stringWithFormat:@"%@ \n %@,%@,%@,%@,%@,%@",mystr,str_type,str_name,str_user,str_pwd,str_url,str_descr];

    }
    csvstr=[NSString stringWithFormat:@"%@ \n %@",csvstr,mystr];   
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];

    NSString *filename = [docDir stringByAppendingPathComponent:[NSString stringWithFormat:@"My Private Closet.csv"]];
    NSError *error = NULL;
    BOOL written = [csvstr writeToFile:filename atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (!written)
    NSLog(@"write failed, error=%@", error);
person kb920    schedule 18.07.2012

Это противоречит здравому смыслу, но имя файла, которое вы прикрепляете, не включает расширение. Таким образом, с именем файла "test.csv":

[mailViewController addAttachmentData:myData 
                             mimeType:@"text/csv" 
                             fileName:@"test"];
person Mundi    schedule 17.07.2012
comment
Привет, спасибо за ваш ответ, но это ничего не изменило. Однако я отредактировал свой код, чтобы включить изменения. - person Jack Nutkins; 17.07.2012
comment
Можете ли вы проверить, что файл записан и содержит правильные данные? Кроме того, убедитесь, что myData что-то содержит. (Я использовал dataWithContentsOfURL, и это сработало.) - person Mundi; 17.07.2012