2017-12-27 8 views
0

Ich versuche, die Emojis in dieser App zu speichern, die ich in Apfel Buch gelernt, aber das Problem ist, dass ich in dem Buch die nächsten Schritte nicht verstehen,speichern mit Datei-Manager in swift4

ein statisches loadSampleEmojis() erstellen Methode, die eine vordefinierte [Emoji] -Kollektion erstellt und zurückgibt. Sie können die Liste, die Emojis zugewiesen wurde, in EmojiTableViewController als Ihre Liste von Elementen verwenden.

Aktualisieren Sie Emojis, die zu einer leeren Sammlung und nicht zu einer großen Beispielkollektion initialisiert werden.Wenn die viewdidload() -Methode aufgerufen wird, sollten Sie das Dokument/emojis-Verzeichnis nach allen zuvor gespeicherten Emoji-Objekten mit loadFrommile() überprüfen Sie werden Emojis zugewiesen.wenn Sie dem Ergebnis von loadSampleEmojis() keine Emojis zuweisen.

Denken Sie einen Moment darüber nach, wann es angebracht sein könnte, Ihr Emoji-Objekt zu speichern. in diesem Fall der zentrale Punkt für Ihr Datum ist die Emojis auf dem Emojitablenviewcontroller mit Mitteln, es wäre angemessen, saveToFile (emojis:) immer wenn die Emojis-Eigenschaft geändert wird. Als nächstes überlegen Sie, wann es angebracht sein könnte, Ihre archivierten Emoji-Objekte zu laden. In diesem einfachen Fall gibt es tatsächlich nur einen Punkt, an dem die archivierten Daten entpackt werden müssen: Wenn die erste Ansicht geladen wird, sollten Sie diese bereits aufrufen Methode in der ersten Ansicht Controller viewdidload().

das ist, was ich bisher geschrieben habe,

import Foundation 


struct Emoji : Codable { 
    var symbol : String 
    var name : String 
    var description : String 
    var usage : String 
    static let documentsdirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
    static let archiveurl = documentsdirectory.appendingPathComponent("emojis").appendingPathExtension("plist") 

    static func SaveToFile (emojis: [Emoji]) { 
     let propetyencod = PropertyListEncoder() 
     let encodemoj = try? propetyencod.encode(emojis) 
     try? encodemoj?.write(to : archiveurl , options : .noFileProtection) 
    } 
    static func loadeFromFile() -> [Emoji] { 
    let propetydicod = PropertyListDecoder() 
     if let retrivdate = try? Data(contentsOf: archiveurl), 
     let decodemoj = try? 
      propetydicod.decode(Array<Emoji>.self, from: retrivdate){ 
    return decodemoj 

     } 
     return [Emoji]() 
    } 



} 



import UIKit 

class emojiTableViewController: UITableViewController { 

    var emojis : [Emoji] = [ 
     Emoji(symbol: "", name: "Grinning Face", 
       description: "A typical smiley face.", usage: "happiness"), 
     Emoji(symbol: "", name: "Confused Face", 
       description: "A confused, puzzled face.", usage: "unsure what to think; displeasure"), 
     Emoji(symbol: "", name: "Heart Eyes", 
       description: "A smiley face with hearts for eyes.", 
       usage: "love of something; attractive"), 
     Emoji(symbol: "", name: "Police Officer", 
       description: "A police officer wearing a blue cap with a gold badge.", usage: "person of authority"), 
     Emoji(symbol: "", name: "Turtle", description: 
      "A cute turtle.", usage: "Something slow"), 
     Emoji(symbol: "", name: "Elephant", description: 
      "A gray elephant.", usage: "good memory"), 
     Emoji(symbol: "", name: "Spaghetti", 
       description: "A plate of spaghetti.", usage: "spaghetti"), 
     Emoji(symbol: "", name: "Die", description: "A single die.", usage: "taking a risk, chance; game"), 
     Emoji(symbol: "⛺️", name: "Tent", description: "A small tent.", usage: "camping"), 
     Emoji(symbol: "", name: "Stack of Books", 
       description: "Three colored books stacked on each other.", 
       usage: "homework, studying"), 
     Emoji(symbol: "", name: "Broken Heart", 
       description: "A red, broken heart.", usage: "extreme sadness"), Emoji(symbol: "", name: "Snore", 
                        description: 
       "Three blue \'z\'s.", usage: "tired, sleepiness"), 
                       Emoji(symbol: "", name: "Checkered Flag", 
                        description: "A black-and-white checkered flag.", usage: 
                       "completion")] 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     navigationItem.leftBarButtonItem = editButtonItem 


     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 52.0 
     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     if section == 0 { 
      return emojis.count 
     }else{ 
      return 0 
     } 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "emojicell", for: indexPath) as! cellviewTableViewCell 

     let emoji = emojis[indexPath.row] 
     cell.update(with: emoji) 

     cell.showsReorderControl = true 
     return cell 
    } 


    @IBAction func editbutton(_ sender: UIBarButtonItem) { 
     let tablevieweditingmod = tableView.isEditing 

     tableView.setEditing(!tablevieweditingmod, animated: true) 

    } 

    override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 
     return.delete 

    } 

    override func viewWillAppear(_ animated: Bool) { 
    tableView.reloadData() 
    } 

    /* 
    // Override to support conditional editing of the table view. 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the specified item to be editable. 
     return true 
    } 
    */ 


    // Override to support editing the table view. 
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == .delete { 
      // Delete the row from the data source 
      emojis.remove(at: indexPath.row) 
      tableView.deleteRows(at: [indexPath], with: .automatic) 
     } else if editingStyle == .insert { 
      // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
     }  
    } 



    // Override to support rearranging the table view. 
    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { 
     let movedEmoji = emojis.remove(at: fromIndexPath.row) 
     emojis.insert(movedEmoji, at: to.row) 
     tableView.reloadData() 
    } 
    /* 
    // Override to support conditional rearranging of the table view. 
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the item to be re-orderable. 
     return true 
    } 
    */ 

    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "editcell"{ 
     let indexpath = tableView.indexPathForSelectedRow! 
     let emoji = emojis[indexpath.row] 
      let edittableview = segue.destination as! addTableViewController 
      edittableview.emoji = emoji 
    } 
} 
    @IBAction func unwindToemojitableview(segue: UIStoryboardSegue){ 

     guard segue.identifier == "saveun" else {return} 
     let sourseviewcontroler = segue.source as! addTableViewController 
     if let emoji = sourseviewcontroler.emoji{ 
      if let selectedindexpath = tableView.indexPathForSelectedRow{ 
       emojis[selectedindexpath.row] = emoji 
       tableView.reloadRows(at: [selectedindexpath], with: .none) 
      }else { 
       let newindexpath = IndexPath(row: emojis.count, section: 0) 
       emojis.append(emoji) 
       tableView.insertRows(at: [newindexpath], with: .automatic) 
      } 
     } 
    } 

} 





import UIKit 

class addTableViewController: UITableViewController { 

    var emoji : Emoji? 

    @IBOutlet weak var symboltexfiel: UITextField! 
    @IBOutlet weak var nametexfiel: UITextField! 
    @IBOutlet weak var descriptexfiel: UITextField! 
    @IBOutlet weak var usagetexfiel: UITextField! 
    @IBOutlet weak var savebutt: UIBarButtonItem! 


    override func viewDidLoad() { 

     super.viewDidLoad() 
     if let emoji = emoji{ 
      symboltexfiel.text = emoji.symbol 
      nametexfiel.text = emoji.name 
      descriptexfiel.text = emoji.description 
      usagetexfiel.text = emoji.usage 
     } 
     ubdatesavebutt() 
    } 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     super.prepare(for: segue, sender: sender) 
     guard segue.identifier == "saveun" else {return} 
     let sym = symboltexfiel.text ?? "" 
     let nam = nametexfiel.text ?? "" 
     let de = descriptexfiel.text ?? "" 
     let use = usagetexfiel.text ?? "" 
     emoji = Emoji(symbol: sym, name: nam, description: de, usage: use) 
    } 


    func ubdatesavebutt() { 
     let symbol = symboltexfiel.text ?? "" 
     let name = nametexfiel.text ?? "" 
     let descr = descriptexfiel.text ?? "" 
     let use = usagetexfiel.text ?? "" 
     savebutt.isEnabled = !symbol.isEmpty && !name.isEmpty && !descr.isEmpty && !use.isEmpty 
    } 

    @IBAction func ediittex(_ sender: UITextField) { 
     ubdatesavebutt() 
    } 

} 


    import UIKit 

    class cellviewTableViewCell: UITableViewCell { 

     @IBOutlet weak var symbollabel: UILabel! 
     @IBOutlet weak var namelabel: UILabel! 
     @IBOutlet weak var descriptionlabel: UILabel! 


     override func awakeFromNib() { 
      super.awakeFromNib() 
      // Initialization code 
     } 

     override func setSelected(_ selected: Bool, animated: Bool) { 
      super.setSelected(selected, animated: animated) 

      // Configure the view for the selected state 
     } 

     func update(with emoji : Emoji) { 
      symbollabel.text = emoji.symbol 
      namelabel.text = emoji.name 
      descriptionlabel.text = emoji.description 
     } 


    } 

Antwort

0

Zum einen können benötigen statische Methode hinzufügen, das zurück [Emoji] und enthält Ihre Emoji Preset (von Emojis Tabelle View-Controller).

static func loadSampleEmojis() -> [Emoji]{ 
    return [Your emojis array]} 

Danach wird in Emoji Table View-Controller, müssen Sie Emojis wie

var emojis = [Emoji]() 

Als nächstes wird in der viedDidLoad() müssen Sie überprüfen, um definieren, ob es irgendwelche Daten in Deine ArchivURL? Und wenn ja - um es Ihren Emojis zuzuweisen, vergeben Sie sonst ein Preset.

if let savedEmojis = Emoji.loadFromFile() { 
emojis = savedEmojis 
} else { 
emojis = Emoji.loadSampleEmoji()} 

Und danach

Emoji.saveToFile(emoji: emojis) 

zu Tableview (_, fügen moveRowAt:, :), Tableview (editingStyle) und unwindSegue.

Außerdem müssen Sie korrigieren:

static func loadFromFile() -> [Emoji]? {..} 

oder Steuerfluss in viewDidLoad wird nicht funktionieren.

+0

Vielen Dank Herr .... Sie sind der Mann – user8058965

Verwandte Themen