Создание и использование 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 не подключен. он просто имеет текст "results.csv"
что я делаю неправильно?
Ответы
Ответ 1
Проблема окажется в вашей строке 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];
}
Ответ 2
Я хочу поделиться своим решением UIActivityViewController и поделиться текстом в виде файла CSV. Это решение работает для совместного использования через Mail и даже Save to 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
}
Надеюсь, это поможет!:)
Ответ 3
Это работало для меня как версия Swift 3, работает как вложение в Mail и сохраняет в 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)
}
}