создание и использование csv-файла с помощью UIActivityViewController
Итак, я создаю .csv-файл, а затем разрешить пользователю совместно использовать его с помощью UIActivityViewController.
Мой код для создания csv-файла вернет NSURL файла:
- (NSURL *)exportToCSV
{
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *filePath = [docPath stringByAppendingPathComponent:@"results.csv"];
if (![[NSFileManager defaultManager] fileExistsAtPath:docPath]) {
[[NSFileManager defaultManager] createFileAtPath:filePath
contents:nil
attributes:nil];
}
NSMutableString *contents = [NSMutableString stringWithCapacity:0];
//fill contents with data in csv format
// ...
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[fileHandle writeData:[contents dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];
return [NSURL fileURLWithPath:filePath];
}
И затем моя активность использует этот NSURL для инициирования UIActivityViewController:
- (IBAction)shareButtonPressed:(id)sender {
NSArray *activityItems = @[@"results.csv", [self.object exportToCSV]];
UIActivityViewController *shareScreen = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
[self presentViewController:shareScreen animated:YES completion:nil];
}
Когда я выбираю опцию отправить по почте, csv-файл не прикрепляется. он просто имеет текст " результаты.csv "
Что я делаю не так?
3 ответа:
Проблема, по-видимому, находится в вашей строке
fileExistsAtPath
. Вы, кажется, говорите: "если каталог документов не существует, то создайте файл". Это, конечно, неправильно.Лично я бы потерял этот материал и изменил его на
- (NSURL *)exportToCSV { NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; NSString *filePath = [docPath stringByAppendingPathComponent:@"results.csv"]; NSMutableString *contents = [NSMutableString stringWithCapacity:0]; //fill contents with data in csv format // ... NSError *error; [contents writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error]; // check for the error return [NSURL fileURLWithPath:filePath]; }
Я хочу поделиться своим решением UIActivityViewController и поделиться текстом в виде CSV-файла. Это решение работает для обмена по почте и даже сохранения в Dropbox.
@IBAction func shareCsv(sender: AnyObject) { //Your CSV text let str = self.descriptionText.text! filename = getDocumentsDirectory().stringByAppendingPathComponent("file.csv") do { try str.writeToFile(filename!, atomically: true, encoding: NSUTF8StringEncoding) let fileData = NSURL(fileURLWithPath: filename!) let objectsToShare = [fileData] let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) self.presentViewController(activityVC, animated: true, completion: nil) } catch { print("cannot write file") // failed to write file – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding } } func getDocumentsDirectory() -> NSString { let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let documentsDirectory = paths[0] return documentsDirectory }
Надеюсь, это поможет! :)
Это сработало для меня как версия Swift 3, работает как вложение в Почте и сохраняет в Dropbox.
var csvDetailsString = "" for myObject in myObjectsArray { csvDetailsString = csvDetailsString.appending(myObject.someText) csvDetailsString = csvDetailsString.appending(",") csvDetailsString = csvDetailsString.appending("More Stuff") csvDetailsString = csvDetailsString.appending("\n") } let fileName = "Output" let docDirectory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) if let fileURL = docDirectory?.appendingPathComponent(fileName).appendingPathExtension("csv") { do { try csvDetailsString.write(to: fileURL, atomically: true, encoding: .utf8) let objectsToShare = [fileURL] let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) activityVC.excludedActivityTypes = [UIActivityType.addToReadingList] self.present(activityVC, animated: true, completion: nil) } catch let error as NSError { print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription) } }