2012-12-16 8 views
10

Così sto creando un file .csv e quindi consentendo all'utente di condividerlo utilizzando UIActivityViewController.creazione e utilizzo di un file .csv con UIActivityViewController

Il mio codice per creare il file CSV restituirà il NSURL del file:

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

e poi la mia attività utilizza che NSURL per avviare l'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]; 
} 

Quando seleziono la posta un opzione, il file csv non è allegato. ha solo il testo "results.csv"

cosa sto facendo di sbagliato?

+1

Hai guardato il file? Va bene? Puoi aprire il file nella cartella del tuo simulatore ('~/Library/Application Support/iPhone Simulator/...', potresti dover tenere premuto il tasto 'option' per vedere la cartella' Library' nel tuo Finder di Mac OS X) e confermare che il file è ok. Generalmente salverei la stringa semplicemente usando il metodo di istanza 'NSString'' writeToFile'. Elimina anche gli oggetti 'NSFileManager' e' NSFileHandle'. – Rob

+0

Ma in risposta alla tua domanda, il problema sembra essere nella tua riga 'fileExistsAtPath'. Sembra che tu stia dicendo "se la directory dei documenti non esiste, quindi crea il file". Probabilmente intendevi 'filePath' lì, non' docPath'. – Rob

risposta

6

Il problema sembra essere nella linea fileExistsAtPath. Sembra che tu stia dicendo "se la directory dei documenti non esiste, quindi crea il file". Non è certamente giusto.

Personalmente, avrei perso quella roba e cambiare per essere

- (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

voglio condividere la mia soluzione di UIActivityViewController e il testo condivisione come file CSV. Questa soluzione funziona per la condivisione via Mail e persino su Salva 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 
} 

Spero che sia d'aiuto! :)

+0

Impossibile farlo funzionare con Salva su Dropbox quando si utilizza UIActivityItemProvider personalizzato :-( – Andy

+0

Che tipo di problema si ha? –

+0

Bene non raccoglie il file quando si utilizza il provider personalizzato. L'elemento segnaposto è impostato su NSURL su file . – Andy

2

Questo ha funzionato per me come una versione di Swift 3, funziona come allegato in Mail e salva 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) 
    } 
} 
Problemi correlati