我试着在这个应用程序中保存我在苹果书里学到的表情符号,但问题是我不理解书中接下来的步骤,
创建一个静态loadSampleEmojis()方法,该方法将创建并返回预定义的[Emoji]集合。您可以使用EmojiTableViewController中分配给emojis的列表作为项目列表。
更新要初始化为空集合而不是大样本集合的emojis。调用viewdidload()方法时,应使用loadFromfile()检查documents/emojis目录中以前保存的任何Emoji对象。如果找到它们,请将它们分配给emojis。如果没有将emojis分配给loadSampleEmojis()的结果。
花点时间想想什么时候可以保存你的Emoji对象。
在这种情况下,日期的中心点是emojis在Emojitableviewcontroller上执行,这意味着只要emojis属性发生更改,就可以调用saveToFile(emojis:)。
接下来,考虑何时可以加载存档的Emoji对象。同样,在这种简单的情况下,只需要一点存档数据就不需要归档:第一个视图加载时。您应该已经在第一个视图控制器viewdidload()中调用此方法。
这是我到现在为止写的,

 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
        }


    }

最佳答案

首先,您需要添加静态方法,它将返回[Emoji],并包含您的Emoji预置(来自Emoji表视图控制器)。

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

之后,在Emoji Table View Controller中,需要定义如下的emojis
var emojis = [Emoji]()

接下来,在viedDidLoad()中,您需要检查您的ArchiveURL中是否有任何数据?如果是-将其分配给你的表情符号,否则分配预设。
if let savedEmojis = Emoji.loadFromFile() {
emojis = savedEmojis
} else {
emojis = Emoji.loadSampleEmoji()}

在那之后加上
Emoji.saveToFile(emoji: emojis)

到tableView(u,moveRowAt:,to:)、tableView(editingStyle)和unwindSegue。
此外,您还需要纠正:
static func loadFromFile() -> [Emoji]? {..}

或者viewDidLoad中的控制流不起作用。

10-08 05:58