2017-06-30 7 views
2

Je cherche un moyen de créer des fichiers séparés. Par exemple: J'ai une application qui a une forme telle que le nom, la date etc. et quand j'appuie sur la sauvegarde, je veux enregistrer toutes les informations dans cette forme de l'utilisateur dans un dossier. Chaque fois que le formulaire est rempli, je veux qu'un nouveau fichier soit créé pour chaque utilisateur. Le fichier sera sauvegardé dans le répertoire documents de l'application. Le nom du fichier doit provenir du champ de texte 'nom' du formulaire. J'ai regardé les moyens de créer des fichiers dans swift mais le nom de fichier est toujours codé en dur dans l'URL du chemin et chaque fois que le formulaire est rempli, l'information est sauvegardée sur le même fichier. Je ne veux pas faire ça. Toute solution ou conseil est apprécié, je n'arrive pas à trouver de solution à ce problème en ligne (seulement comment créer un fichier avec un nom de fichier codé en dur, ce que je suis déjà capable de faire).Création de fichiers séparés

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

Ne codez pas le nom de fichier. Le nom du fichier doit provenir du 'nom' + 'date' + 'creationTime' du formulaire. Cela fera un nom de fichier unique. – luckyShubhra

+0

nous montrez votre code de travail. Ce serait utile. – luckyShubhra

+0

@luckyShubhra J'ai ajouté le code, il ne fonctionne pas correctement car il enregistre seulement la date mais n'enregistre pas le reste des informations du formulaire. S'il vous plaît supporter avec moi si des erreurs je suis un débutant. Merci – Aneesa

Répondre

1

Il enregistre uniquement les dates que vous créez le fichier pour chaque champ du même nom. Il est écrasé par un nouveau fichier à chaque fois. Le dernier fichier que vous créez est de date, donc seule la date persiste. Si vous voulez enregistrer toutes les données de formulaire pour un utilisateur, vous pouvez le faire comme ci-dessous. Vous devez créer un nom de fichier dynamique pour chaque formulaire afin qu'il soit écrasé.

@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

Pour supprimer mot Optional avoir besoin de forcer la valeur déroulez en mettant un point d'exclamation (!) Après l'objet besoin de déballer.

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

si vous avez besoin titre comme organdonationno simplement modifier:

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

Assurez-vous que votre nom est unique afin que ne soit pas remplacé.

Espérons que ça aide. Codage heureux !!

+0

Salut, merci pour cela, puis-je demander votre aide pour quelque chose d'autre concernant ce sujet si possible. Si je devais enregistrer une image dans ce fichier, comment puis-je le faire à partir d'un autre contrôleur de vue. Ainsi, par exemple, une fois que j'ai enregistré les détails généraux dans le fichier .txt je voudrais prendre une image, puis enregistrer cette image dans le même fichier. comment puis-je choisir d'envoyer ces données particulières dans le même fichier. Merci pour votre aide très appréciée. – Aneesa

+0

@Aneesa Je serai heureux de vous aider. Vous devez publier ceci comme nouveau ques SO. – luckyShubhra

1

Ma solution semble similaire ci-dessus. Vous feriez mieux d'utiliser les informations que votre utilisateur a saisies à partir des champs de texte pour organiser un nom unique de votre fichier. Et je vous recommande fortement d'écrire un modèle pour stocker votre propriété, et de faire le travail de sauvegarde sur disque pour l'intérêt de votre codage. Je peux vous donner un exemple que je viens d'écrire sur mon terrain de jeu:

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

}

Le code que je vous écris est mis les propriétés de la struct dans un NSArray qu'il peut être facilement sérialisé comme un objet JSON. JSON est un type de structure de données bien affichée. Quand il est écrit dans votre fichier disque, vous pouvez ouvrir le fichier .json pour voir à l'intérieur. Ce sera comme chose [ string1, string2, string3, string4, string5, string6], ce qui est assez facile à comprendre.
et vous pouvez l'utiliser de cette façon:

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

Si vous utilisez 4 rapide, il est un moyen pratique de tourner la struct User pour objet JSON. Vous avez juste besoin de laisser le User se conformer à Codable, et la mise en œuvre sous-jacente de la pomme fera tout le travail.

Struct User: Codable { 
+0

Merci pour cet exemple. Cependant, je reçois cette erreur lorsque je cours le code. "L'expression était trop complexe pour être résolue dans un temps raisonnable, envisager de diviser les expressions en sous-expressions distinctes". C'est pour le chemin d'accès "let pathComponent = organdonationno + donationage + nomService + hopitauxhospital + date + ID +" .json " ". Toutes les solutions à comment je peux réparer cette erreur. Et si je devais simplement avoir l'ID comme nom du fichier .json? J'ai essayé mais j'ai eu un tas d'erreurs. – Aneesa

+0

C'est mon erreur, je l'ai écrit trop vite pour découvrir que le type de ces propriétés basées sur une chaîne est NSString. Et dans NSString, il n'y a pas un tel opérateur '+' à utiliser. Donc, vous devriez changer cette ligne à 'let pathComponent = ID.appending (" .json ")' – Turtleeeeee