2017-06-30 5 views
2

私は、別々のファイルを作成する方法を探しています。たとえば、名前、日付などのフォームを持つアプリケーションがあります。保存を押すと、そのフォームのすべての情報をファイルに保存します。フォームが記入されるたびに、各ユーザーのために新しいファイルを作成する必要があります。ファイルは、アプリケーションのドキュメントディレクトリに保存されます。ファイルの名前は、フォームの「名前」テキストフィールドから来る必要があります。私は迅速にファイルを作成する方法を見てきましたが、ファイル名は常にパスのURLにハードコードされ、フォームが記入されるたびに情報は同じファイルに保存されます。私はこれをしたくありません。どのような解決策やアドバイスをいただければ幸いです。私はこれをオンラインで解決する方法が見つからないようです(ハードコードされたファイル名でファイルを作成する方法のみです)。別ファイルを作成する

import UIKit 

class FormViewController: UIViewController { 

    @IBOutlet weak var organdonationno: UITextField! 
    @IBOutlet weak var donorage: UITextField! 
    @IBOutlet weak var snodname: UITextField! 
    @IBOutlet weak var donorshospital: UITextField! 
    @IBOutlet weak var date: UITextField! 
    @IBOutlet weak var ID: UITextField! 

    var fileMgr: FileManager = FileManager.default 
    var docsDir: String? 
    var dataFile: String? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let filemgr = FileManager.default 
     let dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask) 
     dataFile = dirPaths[0].appendingPathComponent("path").path 
     if filemgr.fileExists(atPath: dataFile!) { 
      let databuffer1 = filemgr.contents(atPath: dataFile!) 
      let databuffer2 = filemgr.contents(atPath: dataFile!) 
      let databuffer3 = filemgr.contents(atPath: dataFile!) 
      let databuffer4 = filemgr.contents(atPath: dataFile!) 
      let databuffer5 = filemgr.contents(atPath: dataFile!) 

      let datastring1 = NSString(data: databuffer1!, encoding: String.Encoding.utf8.rawValue) 
      let datastring2 = NSString(data: databuffer2!, encoding: String.Encoding.utf8.rawValue) 
      let datastring3 = NSString(data: databuffer3!, encoding: String.Encoding.utf8.rawValue) 
      let datastring4 = NSString(data: databuffer4!, encoding: String.Encoding.utf8.rawValue) 
      let datastring5 = NSString(data: databuffer5!, encoding: String.Encoding.utf8.rawValue) 

      organdonationno.text = datastring1 as? String 
      donorage.text = datastring2 as? String 
      snodname.text = datastring3 as? String 
      donorshospital.text = datastring4 as? String 
      date.text = datastring5 as? String 
     } 
     // Do any additional setup after loading the view. 
    } 

    @IBAction func savdata(_ sender: Any) { 
     let databuffer1 = (organdonationno.text)!.data(using: String.Encoding.utf8) 
     let databuffer2 = (donorage.text)!.data(using: String.Encoding.utf8) 
     let databuffer3 = (snodname.text)!.data(using: String.Encoding.utf8) 
     let databuffer4 = (donorshospital.text)!.data(using: String.Encoding.utf8) 
     let databuffer5 = (date.text)!.data(using: String.Encoding.utf8) 

     fileMgr.createFile(atPath: dataFile!, contents: databuffer1, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer2, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer3, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer4, attributes: nil) 
     fileMgr.createFile(atPath: dataFile!, contents: databuffer5, attributes: nil) 

    } 
} 
+1

ファイル名を指定しないでください。ファイルの名前は、フォームの 'name' + 'date' + 'creationTime'から来る必要があります。それは一意のファイル名になります。 – luckyShubhra

+0

私たちの作業コードを示しています。それは役に立つだろう。 – luckyShubhra

+0

@luckyShubhraコードを追加しましたが、日付だけを保存するだけでフォームの残りの情報は保存されないため、正しく動作しません。私が初心者である間違いがあれば、私に同行してください。 – Aneesa

答えて

1

あなたが同じ名前ですべてのフィールド用のファイルを作成しているので、それが唯一の日付を保存します。毎回新しいファイルで上書きされます。最後に作成されるファイルは日付であるため、日付のみが保存されます.1人のユーザーのすべてのフォームデータを保存するには、以下のようにします。すべてのフォームが上書きされるように、動的なファイル名を作成する必要があります。

@IBAction func savdata(_ sender: Any) { 

let fileName="\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) " 

let file = "\(fileName).txt" //this is the file. we will write to and read from it 

let text = fileName //just a text 

if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { 

let path = dir.appendingPathComponent(file) 

//writing 
do { 
    try text.write(to: path, atomically: false, encoding: String.Encoding.utf8) 
    } 
    catch {/* error handling here */} 

    //reading 
    do { 
    let text2 = try String(contentsOf: path, encoding: String.Encoding.utf8) 
    } 
catch {/* error handling here */} 
} 

------ EDIT --------

へのオブジェクトの後に感嘆符(!)を置くことによって値をアンラップ強制する必要があるためにOptional単語を削除するにはアンラップする必要があります。あなたはorgandonationnoだけの編集などのタイトルが必要な場合は

var canBeNil : String? = "shubhra" 
print(canBeNil) // output Optional("shubhra") 
print(canBeNil!) // output shubhra 

let fileName="\(organdonationno.text)" 
let text = "\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) " 

はちょうどあなたのファイル名がようが上書きされていない一意であることを確認してください。

希望します。ハッピーコーディング!!

+0

こんにちは、ありがとう、私は可能な場合は、このトピックに関連する何かのためのあなたの援助を求めることができます。私はこのファイルに画像を保存する場合、どのように私は別のビューコントローラからこれを行うことができます。たとえば、一般的な詳細を.txtファイルに保存したら、イメージを取得してそのイメージを同じファイルに保存することができます。その特定のデータを同じファイルに送信する方法を選択することができます。ご協力いただきありがとうございました。 – Aneesa

+0

@Aneesa私は助けてうれしい。あなたは新しいものとしてこれを投稿する必要があります。 – luckyShubhra

1

私の解決策は上記と同様です。テキストフィールドから入力した情報を使用して、ファイルの一意の名前を整理することをお勧めします。そして、私は強くあなたのプロパティを保存するモデルを書くことを強くお勧めし、あなたのコーディングの明確さのためにディスクに保存する仕事をしてください。私はあなたに私はちょうど私の遊び場に書いた例を与えることができます。

struct User { 
let organdonationno: NSString 
let donorage: NSString 
let snodName: NSString 
let donorshospital: NSString 
let date: NSString 
let ID: NSString 

func saveToJSONFile() { 
    guard let documentDirectoryUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } 

    let pathComponent = ID.appending(".json") 

    let array = NSArray(array: [organdonationno, donorage, snodName, donorshospital, date, ID]) 

    let fileURL = documentDirectoryUrl.appendingPathComponent(pathComponent) 

    do { 
     let data = try JSONSerialization.data(withJSONObject: array, options: []) 
     try data.write(to: fileURL, options: .atomic) 
    } 
    catch { 
     print(error) 
    } 
} 

}

私はそれが簡単にJSONオブジェクトとしてシリアライズすることができNSArrayに構造体のプロパティを入れて書いているコード。 JSONはよく表示されるデータ構造の一種です。ディスクファイルに書き込まれたら、.jsonファイルを開いて内部を見ることができます。それはかなり理解しやすい[ string1, string2, string3, string4, string5, string6]もののようになります。
、あなたがこのようにそれを使用することができます:あなたが迅速4を使用している場合

let user = User(organdonationno: datastring1, donorage: datastring2, snodName: datastring3, donorshospital: datastring4, date: datastring5, ID: datastring6) 
user.saveToJSONFile() 

、JSONオブジェクトにでUser構造体をオンにする便利な方法があります。 UserCodableに準拠させるだけで、リンゴの基礎となる実装はすべての作業を行います。

Struct User: Codable { 
+0

ありがとうございます。しかし、私はコードを実行すると、このエラーが発生します。 「表現はあまりにも複雑で、妥当な時間に解決できず、表現を別個のサブ表現に分割することを検討する」これは、パス名の "レットパスコンポーネント= organdonationno + donorage + snodName +ドナー病院+日付+ ID +" .json " "です。どのように私はこのエラーを修正することができますすべてのソリューション。また、もし私が.jsonファイルの名前としてIDを持っていたらどうなりますか?私はこれを試みたが、エラーの束を得た。 – Aneesa

+0

これは私の間違いですが、文字列ベースのプロパティの型がNSStringであることを知るには速すぎます。 NSStringでは、このような+演算子は使用できません。だから、その行を 'let pathComponent = ID.appending(" .json ")' – Turtleeeeee

関連する問題