2012-12-16 9 views
10

So erstellen ich eine CSV-Datei und dann ermöglicht es dem Benutzer, es mit dem UIActivityViewController zu teilen.Erstellen und Verwenden einer CSV-Datei mit UIActivityViewController

Mein Code der CSV-Datei wird wieder die NSURL der Datei zu erstellen:

- (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]; 
} 

und dann meine Tätigkeit verwendet, dass NSURL die UIActivityViewController einzuleiten:

- (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]; 
} 

Wenn ich Post ein wählen Option, die CSV-Datei ist nicht angehängt. es hat nur den Text "results.csv"

was mache ich falsch?

+1

Haben Sie sich die Datei angesehen? Ist es o.k? Sie können die Datei im Ordner Ihres Simulators öffnen ('~/Library/Application Support/iPhone Simulator/...'; Sie müssen möglicherweise die 'Option'-Taste gedrückt halten, um den 'Library'-Ordner in Ihrem Mac OS X Finder zu sehen) und bestätige, dass die Datei in Ordnung ist. Normalerweise würde ich die Zeichenfolge nur mit der 'NSString'-Instanzmethode' writeToFile' speichern. Beseitigt auch die NSFileManager- und NSFileHandle-Dateien. – Rob

+0

Aber als Antwort auf Ihre Frage scheint das Problem in Ihrer Zeile 'fileExistsAtPath' zu liegen. Sie scheinen zu sagen "wenn das Dokumentenverzeichnis nicht existiert, dann erstellen Sie die Datei". Du meinst wahrscheinlich 'filePath' dort, nicht' docPath'. – Rob

Antwort

6

Das Problem scheint in Ihrer fileExistsAtPath Linie zu sein. Sie scheinen zu sagen "wenn das Dokumentenverzeichnis nicht existiert, dann erstellen Sie die Datei". Das ist sicher nicht richtig.

Persönlich würde ich das Zeug verlieren und es ändern

- (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]; 
} 
4

ich meine Lösung von UIActivityViewController sein wollen teilen und den Austausch von Text als CSV-Datei. Diese Lösung funktioniert für die Freigabe per Mail und sogar Speichern in 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 
} 

Hoffe es hilft! :)

+0

Funktioniert nicht mit Speichern in Dropbox, wenn benutzerdefinierter UIActivityItemProvider verwendet wird :-( – Andy

+0

Welche Art von Problem haben Sie? –

+0

Nun, es nimmt die Datei nicht auf, wenn benutzerdefinierter Provider verwendet wird. Platzhalterelement wird auf NSURL in Datei festgelegt . – Andy

2

Das funktionierte für mich als Swift 3 Version, funktioniert als Anhang in Mail und speichert in 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) 
    } 
} 
Verwandte Themen