2012-12-16 12 views
10

ile bir .csv dosyası oluşturma ve kullanma. Bir .csv dosyası oluşturuyorum ve sonra kullanıcının UIActivityViewController kullanarak paylaşmasına izin veriyorum.UIActivityViewController

dosyanın NSURL dönecektir csv dosyası oluşturmak için Kodum:

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

sonra Etkinliğimi NSURL UIActivityViewController başlatmak için kullanır: Ben postalarının seçtiğinizde

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

seçeneği, csv dosyası ekli değil. Sadece "results.csv" metnine sahip "

Neyi yanlış yapıyorum?

+1

Dosyaya baktınız mı? Tamam mı? Eğer simülasyon aracının klasörde dosyayı açabilirsiniz ('~/Library/Application Support/iPhone Simülatörü/...'; Mac OS X Finder 'Library' klasörü görmek için' option' tuşunu basılı tutun gerekebilir) ve dosyanın tamam olduğunu onaylayın. Genellikle sadece 'NSString' örnek yöntemi' writeToFile' kullanarak dize tasarruf sağlayacaktır. de 'NSFileManager' ve' NSFileHandle' şeyler ortadan kaldırır. – Rob

+0

Ama soruya yanıt olarak, sorun 'fileExistsAtPath' hattında olarak görünecektir. Sen "belgeler dizini yoksa, o zaman dosyası oluşturmak" diyerek görünmektedir. Muhtemelen 'filePath',' docPath' değil. – Rob

cevap

6

Sorun, fileExistsAtPath satırınızda görünmektedir. Sen "belgeler dizini yoksa, o zaman dosyası oluşturmak" diyerek görünmektedir. Bu kesinlikle doğru değil.

Şahsen ben o şeyi kaybetmek ve ben bir CSV dosyası olarak benim UIActivityViewController çözümünü ve paylaşım metni paylaşmak istiyorum

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

olmasını değiştirmek istiyorum. Bu çözüm, Posta yoluyla ve hatta Dropbox'a kaydetme için çalışır.

@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 
} 

yardımcı olur Umut! :)

+0

Özel UIActivityItemProvider kullanırken Save to Dropbox ile çalışamazsınız :-( – Andy

+0

Ne tür bir sorununuz var? –

+0

Özel sağlayıcı kullanılırken dosyayı almaz, Yer tutucu öğesi dosyaya NSURL olarak ayarlanır . – Andy

2

Bu benim için bir Swift 3 sürümü olarak çalıştı, Posta ekinde çalışır ve Dropbox'ta kaydeder.

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) 
    } 
}