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
}
}
Vielen Dank Herr .... Sie sind der Mann – user8058965