2012-12-16 3 views
10

그래서 .csv 파일을 만들고 사용자가 UIActivityViewController를 사용하여 공유 할 수 있도록하고 있습니다.UIActivityViewController와 함께 .csv 파일을 만들고 사용하십시오.

파일의 NSURL을 반환 CSV 파일 만드는 내 코드 :

- (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 시작하는 것을 사용한다 : I 메일을 선택하면

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

파일을 보았습니까? 괜찮 니? 시뮬레이터 폴더 ('~/Library/Application Support/iPhone Simulator/...')에서 파일을 열 수 있습니다 : Mac OS X Finder에서'Library' 폴더를 보려면'option' 키를 누르고 있어야 할 수도 있습니다) 파일이 정상인지 확인하십시오. 나는 일반적으로'NSString' 인스턴스 메소드'writeToFile'를 사용하여 문자열을 저장합니다. NSFileManager와 NSFileHandle도 제거합니다. – Rob

+0

그러나 귀하의 질문에 대답, 문제가 귀하의'fileExistsAtPath' 줄에 나타납니다. "문서 디렉토리가 존재하지 않으면 파일을 만듭니다"라는 메시지가 나타납니다. 아마도'filePath'가 아니라'filePath'를 사용했을 것입니다. – Rob

답변

6

문제는 fileExistsAtPath 행에있는 것으로 보입니다. "문서 디렉토리가 존재하지 않으면 파일을 만듭니다"라는 메시지가 나타납니다. 그것은 확실히 옳지 않습니다.

개인적으로, 나는 그 물건을 잃고 난 CSV 파일로 내 UIActivityViewController의 솔루션 및 공유 텍스트를 공유 할

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

로 변경 것입니다. 이 솔루션은 메일을 통해 공유하고 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 
} 

희망 하시겠습니까? :)

+0

사용자 지정 UIActivityItemProvider를 사용할 때 보관함에 저장 : --( – Andy

+0

어떤 종류의 문제가 있습니까? –

+0

사용자 지정 공급자를 사용할 때 파일을 가져 오지 않습니다. 자리 표시 자 항목이 NSURL로 설정되어 파일로 저장됩니다. . – Andy

2

이것은 나를 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) 
    } 
} 
관련 문제