2012-12-16 24 views
10

Vì vậy, tôi đang tạo tệp .csv và sau đó cho phép người dùng chia sẻ tệp bằng UIActivityViewController.tạo và sử dụng tệp .csv với UIActivityViewController

Mã của tôi để tạo ra các tập tin csv sẽ trả lại NSURL của tập tin:

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

và sau đó hoạt động của tôi sử dụng mà NSURL để bắt đầu 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]; 
} 

Khi tôi chọn email một tùy chọn, tệp csv không được đính kèm. nó chỉ có văn bản "results.csv"

tôi đang làm gì sai?

+1

Bạn đã xem tệp chưa? Là nó ổn? Bạn có thể mở tệp trên thư mục của trình mô phỏng ('~/Library/Application Support/iPhone Simulator/...'; bạn có thể phải giữ phím 'option' để xem thư mục' Library' trong Mac OS X Finder) và xác nhận rằng tệp là ok. Tôi thường sẽ lưu chuỗi bằng cách sử dụng phương thức 'NSString' instance' writeToFile'. Loại bỏ các công cụ 'NSFileManager' và' NSFileHandle', quá. – Rob

+0

Nhưng để trả lời câu hỏi của bạn, vấn đề có vẻ như nằm trong dòng 'fileExistsAtPath' của bạn. Dường như bạn đang nói "nếu thư mục tài liệu không tồn tại, hãy tạo tệp". Bạn có thể có nghĩa là 'filePath' ở đó, không phải' docPath'. – Rob

Trả lời

6

Sự cố có vẻ như ở dòng fileExistsAtPath của bạn. Dường như bạn đang nói "nếu thư mục tài liệu không tồn tại, hãy tạo tệp". Điều đó chắc chắn không đúng.

Cá nhân, tôi muốn bị mất dữ liệu đó và thay đổi nó được

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

tôi muốn chia sẻ giải pháp của tôi về UIActivityViewController và chia sẻ văn bản dưới dạng tệp CSV. Giải pháp này hoạt động để chia sẻ qua Mail và thậm chí 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 
} 

Hy vọng điều đó sẽ hữu ích! :)

+0

Không thể làm cho nó hoạt động với Lưu vào Dropbox khi sử dụng UIActivityItemProvider :-( – Andy

+0

Loại sự cố nào bạn có? –

+0

Vâng, nó không nhận tệp khi sử dụng nhà cung cấp tùy chỉnh. Mục trình giữ chỗ được đặt thành NSURL thành tệp . – Andy

2

Điều này làm việc cho tôi như một phiên bản Swift 3, hoạt động như một tệp đính kèm trong Thư và lưu trong 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) 
    } 
} 
Các vấn đề liên quan