在swift4中使用文件管理器保存

时间:2017-12-27 14:04:25

标签: ios swift nsfilemanager

我正试图在我在苹果书中学到的这个应用程序中保存表情符号,但问题是我不理解书中的后续步骤,

创建一个静态loadSampleEmojis()方法,该方法将创建并返回预定义的[表情符号]集合。您可以使用EmojiTableViewController中指定给表情符号的列表作为项目列表。

更新emojis以初始化为空集合而不是大样本集合。当调用viewdidload()方法时,您应该使用loadFromfile()检查documents / emojis目录中是否有任何以前保存的表情符号对象。如果它们是发现将它们分配给emojis.if没有将emojis分配给loadSampleEmojis()的结果。

花一点时间考虑一下保存表情符号对象的时机。 在这种情况下,你日期的中心位置是emojis进行Emojitableviewcontroller,意味着每当emojis属性被更改时调用saveToFile(emojis :)是合适的。 接下来,考虑何时可能适合加载存档的表情符号对象。在这个简单的情况下,实际上只需要归档存档数据的一个点:当第一个视图加载时,你应该已经调用了这个方法在第一个视图中控制器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
        }


    }

1 个答案:

答案 0 :(得分:0)

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

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

之后,在表情符号表视图控制器中,您需要定义像

这样的表情符号
var emojis = [Emoji]()

接下来,在viedDidLoad()中,您需要检查ArchiveURL中是否有任何数据?如果是 - 将其分配给您的表情符号,否则指定预设。

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

然后添加

Emoji.saveToFile(emoji: emojis)

到tableView(_,moveRowAt:,to :),tableView(editingStyle)和unwindSegue。

此外,您需要更正:

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

或者viewDidLoad中的控制流将无效。